Laravel - 处理完成后仍在内存中的工作的方法.

问题描述 投票:0回答:1

我的应用程序中有一个Job,用于对文件进行一些操作(复制、替换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个回答
0
投票

这是一个关于队列工作者的异常。队列工作者是一个始终在运行的任务,并检查队列中是否有新的作业要处理。默认情况下,CLI最大执行时间(也就是队列工作者运行的地方)是无限的,这是有原因的。

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

您使用的方法是

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

这在以下文件中有所记载 工作到期和超时

另外, 我还建议你设置你的队列工作者, 确保它在后台永久运行. Laravel建议使用supervisor来完成这个任务, 但是任何你选择的方法(比如创建一个服务, 以某种方式使用pm2等)也是一个不错的选择.

© www.soinside.com 2019 - 2024. All rights reserved.