You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:02:15