Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel多队列:侦听忽略超时/再次启动_Php_Laravel_Queue_Supervisord_Forge - Fatal编程技术网

Php Laravel多队列:侦听忽略超时/再次启动

Php Laravel多队列:侦听忽略超时/再次启动,php,laravel,queue,supervisord,forge,Php,Laravel,Queue,Supervisord,Forge,所以这似乎是一个奇怪的问题,我们有一个进程在一个作业中发送5000或10000封电子邮件,但它每60秒启动一次,即使另一个进程仍在运行 作为执事命令: queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default" queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=productio

所以这似乎是一个奇怪的问题,我们有一个进程在一个作业中发送5000或10000封电子邮件,但它每60秒启动一次,即使另一个进程仍在运行

作为执事命令:

queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default"
queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=production --queue="emails"
作为listen命令:

queue:work database --sleep=10 --daemon --quiet --tries=3 --env=production --queue="default"
queue:listen database --timeout=600 --sleep=10 --quiet --tries=3 --env=production --queue="emails"
这里发生的事情是,如果我们在大约60秒后运行多个侦听器或多个worker deamons,一个新进程将重新启动,感觉像是php超时,但另一个进程将继续,因此它似乎无缘无故地启动一个新进程。在代码中,它将循环,每次从DB收到100封电子邮件并写入日志文件

\Log::info("Getting {$emails->count()} new e-mails, round: {$this->round}
日志文件:

[2015-11-09 13:02:27] production.INFO: Getting 100 new e-mails, round: 1
[2015-11-09 13:02:32] production.INFO: Getting 100 new e-mails, round: 2
[2015-11-09 13:02:38] production.INFO: Getting 100 new e-mails, round: 3
[2015-11-09 13:02:43] production.INFO: Getting 100 new e-mails, round: 4
[2015-11-09 13:02:49] production.INFO: Getting 100 new e-mails, round: 5
[2015-11-09 13:02:55] production.INFO: Getting 100 new e-mails, round: 6
[2015-11-09 13:03:00] production.INFO: Getting 100 new e-mails, round: 7
[2015-11-09 13:03:06] production.INFO: Getting 100 new e-mails, round: 8
[2015-11-09 13:03:11] production.INFO: Getting 100 new e-mails, round: 9
[2015-11-09 13:03:17] production.INFO: Getting 100 new e-mails, round: 10
[2015-11-09 13:03:22] production.INFO: Getting 100 new e-mails, round: 11
[2015-11-09 13:03:28] production.INFO: Getting 100 new e-mails, round: 12
[2015-11-09 13:03:32] production.INFO: Getting 100 new e-mails, round: 1
[2015-11-09 13:03:35] production.INFO: Getting 100 new e-mails, round: 13
[2015-11-09 13:03:42] production.INFO: Getting 100 new e-mails, round: 2
[2015-11-09 13:03:45] production.INFO: Getting 100 new e-mails, round: 14
[2015-11-09 13:03:52] production.INFO: Getting 100 new e-mails, round: 3
在这里,您可以看到旧流程继续,新流程开始,因此它会发送两封电子邮件。启动新进程时,jobs表将尝试次数更新为1,并同时更新reserved_at

有人能帮我吗?这一定是很愚蠢的事情,但我们几乎尝试了所有的方法,而且它一直运行了很多次。运行1个queue deamon worker或queue listen可以解决问题,但我们希望在一个队列上运行多个队列worker,这应该是可能的


我们在forge上运行,生成了带有supervisord的进程,因为Laravel中的TTR(运行时间)为60秒,可以在queue.php配置中配置,仍然在寻找一种解决方案,以每个作业为基础而不是整体设置TTR。我将仅为此作业创建一个单独的队列,并仅使用一个侦听器/工作线程来处理它,这就像在队列配置中向连接数组添加一个新队列一样简单。如果您对两个队列使用相同的驱动程序,并且应该为您解决这个问题,那么这实际上只是一个逻辑分离。然后,您可以向数组中添加另一个通用队列,并针对其他类型的作业运行多个侦听器。