在 laravel 中测试查询执行时间

Posted

技术标签:

【中文标题】在 laravel 中测试查询执行时间【英文标题】:Test query execution time in laravel 【发布时间】:2017-06-04 08:40:37 【问题描述】:

如何在 laravel/phpunit 中测试查询需要多长时间执行?

有没有可能让它不依赖于其他东西?

【问题讨论】:

在您的数据库配置文件中启用数据库日志记录,它会在日志中告诉您执行的每个单独查询 【参考方案1】:

最古老的方法是最好的:

$start = microtime(true);
// Execute the query
$time = microtime(true) - $start;

【讨论】:

作为旁注,在传统的单元测试中,你永远不应该接触你的数据库。单元测试用于测试小的、无状态的功能。数据库就是保存状态,所以在集成测试中测试你的数据库。【参考方案2】:

您可以listen 执行这样的查询并将结果记录到storage/logs/laravel.log

\DB::listen(function ($sql, $bindings, $time) 
    \Log::info($sql, $bindings, $time);
);

您可以只使用$time,但我记录了$sql, $bindings, $time 以完成。

你可以把它放在你的AppServiceProvider中。

更新:

在 Laravel 版本 > 5.5 中,此方法在文档中记录为 listening for query events ;)

【讨论】:

有人知道 Laravel 查询日志中$time 变量的单位吗? 源码中的注释表示是毫秒。从我的测试来看,似乎就是这种情况。 github.com/illuminate/database/blob/…【参考方案3】:

由于 Laravel 5.2 listen 已更改为只有一个参数:

\DB::listen(function ($query) 
     // $query->sql
     // $query->bindings
     // $query->time
);

文档:https://laravel.com/docs/5.2/database

【讨论】:

【参考方案4】:

您可以从 Laravel 6.x 开始使用 ddd($someVar) 助手。

Queries 选项卡描述了在ddd() 之前执行的每个查询

【讨论】:

以上是关于在 laravel 中测试查询执行时间的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 在查询执行前利用时刻

Laravel 4 对我的查询进行基准测试

如何在 laravel 中执行复杂的 mysql 查询

如何使用查询构建在 Laravel 中执行 WHERE NOT

在执行查询之前,如何从 Laravel 的查询构建器中获取原始查询字符串?

如何在 Laravel 查询中执行 IS NOT NULL