【问题标题】:How can I learn more about why my Laravel Queued Job failed?我怎样才能更多地了解我的 Laravel 排队作业失败的原因?
【发布时间】:2016-04-01 19:34:19
【问题描述】:

情况

我正在使用 Laravel 队列来处理大量媒体文件,单个作业预计需要几分钟(假设最多一个小时)。

我正在使用 Supervisor 来运行我的队列,并且一次运行 20 个进程。我的主管配置文件如下所示:

[program:duplitron-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/duplitron/artisan queue:listen database --timeout=0 --memory=500 --tries=1
autostart=true
autorestart=true
user=duplitron
numprocs=20
redirect_stderr=true
stdout_logfile=/var/www/duplitron/storage/logs/duplitron-worker.log

在我的duplitron-worker.log 中,我注意到Failed: Illuminate\Queue\CallQueuedHandler@call 偶尔会出现,我想更好地了解究竟是什么失败了。我的 laravel.log 文件中没有任何内容(通常会出现异常)。

问题

有没有一种方便的方法可以让我详细了解导致我的工作失败的原因?

【问题讨论】:

  • 在 supervisord.conf 的[supervisord] 下添加loglevel。您可以从 debug 开始(在此处查看更多信息:supervisord.org/logging.html)。通常是它失败的原因,因为您运行的代码没有以正确的“退出状态”结束。你也可以在这里看到它:stackoverflow.com/questions/28937722/… 最后一件事,你可能需要在你的配置中添加stderr_logfile

标签: php laravel queue


【解决方案1】:
  • 运行这些命令在db中创建一个表failed_jobs
php artisan queue:failed-table
php artisan migrate
  • 运行队列工作者php artisan queue:work --tries=2

  • 检查您刚刚创建的数据库表failed_jobs 中的异常原因。

【讨论】:

    【解决方案2】:

    为我工作, 在供应商/laravel/framework/src/Illuminate/Notifications/SendQueuedNotifications.php 只需删除“使用 Illuminate\Queue\SerializesModels;” 6号线 & 将第 11 行修改为“使用 Queueable;”

    【讨论】:

    • 从不编辑供应商。这是一个不好的做法。如果可以改进,请尝试使用 pull-request 访问存储库。
    【解决方案3】:

    在较新的 Laravel 版本中,exception 表中有一个 exception 列,其中包含您需要的所有信息。感谢 cdarken 和 Toskan 指出这一点!

    ==== 下面是旧方法

    这是我一直做的事情,但首先 - 确保你有一个失败的作业表!有据可查,查一下:)

    1. 运行php artisan queue:failed 命令以列出所有失败的作业,然后选择您需要的作业。记下 ID。

    2. 然后,请务必使用supervisorctl stop all duplitron-worker: 停止您的队列

    3. 最后,确保 APP_DEBUG 的 .env 设置 = true。

    4. 然后运行php artisan queue:retry {step_job_1_id}

    5. 现在手动运行php artisan queue:listen --timeout=XXX

    如果错误是结构性的(而且大多数是结构性错误),您应该在日志文件中通过调试堆栈获取故障。

    祝你调试顺利:-)

    【讨论】:

    • 这太完美了——谢谢!现在我只需要弄清楚为什么当我重试它时它会起作用(还有......失败的任务会慢慢得到正确的重新处理,尽管我将 --tries 设置为 1 这让我感到困惑,但这是一个单独的问题!)
    • 我猜是一个后续问题/如果您有建议可以添加到您的答案中——有没有办法在批量运行时在日志文件中获取故障堆栈。我怀疑问题的一部分可能与资源受限或超时有关,而当只有一个线程运行时不会发生这种情况。
    • 好吧,就像你说的 - 如果它单独运行良好,它与脚本无关。你缩小了范围,这是个好消息 你最好的选择是检查系统和 php 日志。里面一定有东西!这很可能是超时或内存不足:)
    • --tries=1 如果作业失败,将尝试再运行一次,即每个作业在发送到失败的表之前总共运行 2 次。
    • 不知道后面的版本有没有增加,但是在 5.3 的 failed jobs 表中有一个名为 exception 的列,可以看到实际失败的是什么,不需要上面的技巧跨度>
    【解决方案4】:

    正如@cdarken 指出的,异常可以在您的数据库表failed_jobs 列名exception 中找到。谢谢@cdarken,我希望他的回答是一个答案而不是评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多