我正在使用 Laravel 5.5,我有一些工作需要使用 IMAP 检查电子邮件。有时这可能需要很长时间,或者假设用户弄错了端口或用户名,IMAP 服务器将需要很长时间才能响应。所以我想出了一个主意,我可以将我的工作限制在一段时间内,但是当该期限到期时,不仅我的工作不会转移到失败的工作,而且我的工人也会被杀死。我缺少什么?还有其他方法可以做到这一点吗?如果作业到期,我想在数据库中进行一些更改。有什么想法吗? 预先感谢您
首先,你需要用Supervisor来管理你的工人。如果他们被杀死,主管将再次重新启动他们。
https://laravel.com/docs/5.5/queues#supervisor-configuration
之后,您需要阅读 Laravel 文档中有关作业过期和超时的信息。
https://laravel.com/docs/5.5/queues#job-expirations-and-timeouts
要解决您的问题,您需要增加工人的
--timeout
。你可以尝试3600秒。您还需要增加作业过期时间(retry_after
队列中的config/queues.php
值)。尝试使用 3550 秒。 (如果您的 --timeout
选项比您的 retry_after
配置值长,您的作业可能会被处理两次。)如果您发现问题再次出现,您可以增加超时值。
非常重要的是,如果您发现问题并且不等待 3550 秒来释放作业和工作人员,您的代码必须有 try/catch 来捕获异常并退出。
我总是使用以下命令来运行队列(它没有任何问题):
php artisan queue:work --timeout=0 --delay=0 --memory=0 --tries=0