我的应用程序中有一个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)
我怎样才能解决这个问题?非常感谢
这是一个关于队列工作者的异常。队列工作者是一个始终在运行的任务,并检查队列中是否有新的作业要处理。默认情况下,CLI最大执行时间(也就是队列工作者运行的地方)是无限的,这是有原因的。
确保作业超时的 "正确 "方法是为队列工作者提供一个良好的配置。有两个独立的选项,你应该相互结合使用。retry_after
这是在你的配置中配置的 config/queue.php
和 --timeout=X
选项的队列工作任务。
您使用的方法是
php artisan queue:work --timeout=14000
retry_after => 14060
(一分钟后)这在以下文件中有所记载 工作到期和超时
另外, 我还建议你设置你的队列工作者, 确保它在后台永久运行. Laravel建议使用supervisor来完成这个任务, 但是任何你选择的方法(比如创建一个服务, 以某种方式使用pm2等)也是一个不错的选择.