以下是Kernel.php文件中的方法。
protected function schedule(Schedule $schedule)
{
$schedule->command('queue:listen')->everyFiveMinutes()->withoutOverlapping();
}
我在Godaddy中共享主机帐户,并使用cron作为Laravel Queue。我无法使用Supervisor Queue,因为他们不允许对我的计划进行SSH root访问。以下是截图。我担心CPU使用率和进程数。
我的代码使用队列发送电子邮件进行注册。就是这样。没有其他的东西在使用Queue。对于php artisan命令,每30分钟后运行Cron作业。第一次运行后,显示上面的统计数据。
我做错了吗?
答案 0 :(得分:3)
这是错误的。您应该从不通过cron调度程序调用{{1}},否则您将会遇到类似于您所发生的意外行为。在这种情况下,听起来您正在产生多个队列侦听器。
您应该将queue:listen
配置为永远作为守护进程运行。如果您无法通过GoDaddy访问主管,请切换到真正的服务器提供商,如DigitalOcean或Linode - 并使用它。
答案 1 :(得分:1)
你可以从PHP运行shell命令吗?如果是这样,请在App / Console / kernel.php
中尝试此代码if (!strstr(shell_exec('ps xf'), 'php artisan queue:work'))
{
$schedule->command('queue:work')->everyFiveMinutes();
}
我一直在努力解决这个问题,并在我的(A2hosting)共享主机方案中提出了这个解决方案。它确保队列正常工作,并且始终只有一个实例。如果序列化->emailWrittenOutputTo('your@email.com')
,您就会知道该命令必须重新启动的频率。
经过一周的实施,它完美无瑕。我每分钟都运行schedule:run
cron作业。在您的情况下,您可以每5分钟运行一次。
添加:您的服务器统计信息完全正常。至少有3个进程实际上是cPanel(或类似的)创建进程。运行' ps xf'在你的shell中,亲眼看看。
最后但并非最不重要:您永远不必再运行php artisan queue:work
命令了。 cron工作将负责这一点。即使在作曲家更新之后。
答案 2 :(得分:1)
我把这个要点放了一会儿(查看叉子信息以查看原始作品)来解决同样的问题。除了能够运行exec()并且还关心特定项目所需的定期队列重启之外,它并不需要太多,但实际上并不是一般需要。
https://gist.github.com/muihlinn/bcb17fc0b6425bcb6f26ac907bc91c10
注意:由于某种原因,工匠的队列:restart命令不会重新启动队列,只是杀死它,因此两次调用代码。
答案 3 :(得分:1)
当Laurence写入队列时:不要每隔5分钟开始一次,因为它会一直运行它的背景。
尝试这个要点,它可能有助于解决您的问题,而无需切换托管服务提供商:
https://gist.github.com/sea-reel/3550cfe44c15d8f8878b34adf5814b15 (Laravel 5 Artisan Process整个队列和退出命令)
因此,在gist中添加命令后,您的日程安排应如下所示:
protected function schedule(Schedule $schedule)
{
$schedule->command('work-and-exit')->everyFiveMinutes()->withoutOverlapping();
}
答案 4 :(得分:0)
您可以不时使用queue:restart命令(例如,每5分钟)删除重复的进程。
$schedule->command('queue:restart')->everyFiveMinutes();
$schedule->command('queue:work --daemon')->everyMinute()->withoutOverlapping();