Laravel-完成后仍在内存中的作业的句柄方法



我的应用程序中有一份工作,用于对文件执行一些操作(复制、替换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)

如何解决此问题?非常感谢

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

确保作业超时的"正确"方法是为队列工作者提供良好的配置。有两个单独的选项应该相互结合使用:retry_after,它在config/queue.php中配置,以及队列工作任务的--timeout=X选项。

你使用这个的方式是:

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

这记录在作业到期和超时中

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

最新更新