Laravel多队列Worker下LARAVEL_START计算执行时间不一致问题
Laravel队列任务执行时间计算异常的原因与解决方法
我在Laravel应用中想要给每个任务的日志添加执行时间,用以下代码计算:
$data['meta']['requestDuration'] = round((microtime(true) - LARAVEL_START) * 1000, 2);本地单队列Worker(
php artisan queue:listen)时结果正常(约450ms),但生产环境5个Worker时出现19517ms这类异常值,且数值随Worker运行时长增加而增长。
问题原因
- 队列Worker是常驻进程,
LARAVEL_START常量在Worker进程启动时就被初始化并固定,不会在每个任务执行时重新计算。 - 当前代码计算的是「Worker进程从启动到任务执行结束的总时长」,而非单个任务的实际执行耗时。生产环境中部分Worker可能已经运行了很久,所以计算出的数值会异常大,且随Worker运行时间变长持续增长。
解决方案
方案1:计算单个任务的执行耗时
在任务的handle方法开头记录起始时间,任务逻辑执行完成后计算差值:
public function handle() { $taskStart = microtime(true); // 这里写你的任务执行逻辑 $taskDuration = round((microtime(true) - $taskStart) * 1000, 2); $data['meta']['requestDuration'] = $taskDuration; // 后续写入日志等操作 }
方案2:计算任务从入队到完成的总时长
如果需要统计任务从入队到执行完成的全流程耗时,可以在入队时添加入队时间戳:
// 入队时传入当前时间 YourTask::dispatch()->withMeta(['queued_at' => microtime(true)]);
然后在任务的handle方法中计算时长:
public function handle() { $queuedAt = $this->job->meta('queued_at'); $totalDuration = round((microtime(true) - $queuedAt) * 1000, 2); // 任务执行逻辑 $data['meta']['requestDuration'] = $totalDuration; // 写入日志等操作 }
内容的提问来源于stack exchange,提问作者Stanley Richter
相关产品推荐
相关产品推荐

