【问题标题】:Laravel - Handle method for job still in memory after completationLaravel - 完成后仍在内存中的作业处理方法
【发布时间】:2020-08-07 16:48:32
【问题描述】:

我在我的应用程序中有一个工作,用于对文件执行一些操作(复制、替换 word 文档中的标签、转换为 pdf、zip 文件等...)。根据文件大小,该过程可能需要不同的秒数,所以在句柄方法的第一行我添加了

ini_set('max_execution_time', 14000);

只是为了避免超时错误。问题在于,尽管代码是由一系列 try catch 构成的,因此作业不会失败,但该进程似乎仍在内存中并且没有关闭,即使在最后一行代码返回也是如此。事实上,有时这个异常会出现在我的日志文件中。

Maximum execution time of 14000 seconds exceeded {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 14000 seconds exceeded at ...\\vendor\\laravel\\framework\\src\\Illuminate\\Queue\\Worker.php:606)

我该如何解决这个问题?非常感谢

【问题讨论】:

    标签: php laravel queue timeout jobs


    【解决方案1】:

    这是队列工作者的一个例外。队列工作者是一项始终运行并检查队列以查找要处理的新作业的任务。默认情况下,CLI 最大执行时间(队列工作程序在其中运行)是无限的,这是有充分理由的。

    确保作业良好超时的“正确”方法是为队列工作程序提供良好的配置。您应该结合使用两个单独的选项:retry_after,在您的 config/queue.php 和队列工作任务的 --timeout=X 选项中配置。

    你会使用它的方式是:

    1. 通过运行例如为队列工作程序设置合理的超时时间。 php artisan queue:work --timeout=14000
    2. 确定重试先前失败的队列的时间,例如retry_after => 14060(一分钟后)

    这在Jobs expirations and timeouts中有记录

    此外,我还建议设置您的队列工作程序以确保它在后台永久运行。 Laravel 建议使用 supervisor 来执行此操作,但您选择的任何方法(即提供服务,以某种方式使用 pm2 等)也是一个不错的选择。

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      相关资源
      最近更新 更多