在 cron 作业上使用 queue:work 有问题吗?
Is there a problem to use queue:work on a cron job?
我已经在 hostinger 上部署了我的 laravel 应用程序,它有一些队列作业(如发送电子邮件),我使用 artisan 命令 "queue:work" 添加了一个 cron 作业并且它正在执行每 1 分钟。我做了一些研究,我看到有人说它会消耗大量 RAM - 特别是因为我的 cron 作业设置为每 1 分钟执行一次 artisan 命令。
如果写错了怎么办?
您应该考虑实施 supervisor
来为您监控队列工作人员。
https://laravel.com/docs/5.8/queues#supervisor-configuration
To keep the queue:work process running permanently in the background, you should use a process monitor such as Supervisor
to ensure that the queue worker does not stop running.
高 RAM 使用率通常与 --daemon
标志有关。然而,这可以通过偶尔使用 queue:restart
简单地重新启动队列工作程序来解决。但是如果使用得当,daemon worker 是最有效的,因为它们不会 "reboot" 为每个新工作申请。
https://laravel.com/docs/5.8/queues#running-the-queue-worker
Daemon queue workers do not "reboot" the framework before processing each job. Therefore, you should free any heavy resources after each job completes. For example, if you are doing image manipulation with the GD library, you should free the memory with imagedestroy
when you are done.
如果由于共享主机限制而无法实施 supervisor
,可以使用一些变通方法,例如使用 withoutOverlapping()
选项仅在前一个队列工作程序死亡时才启动新的队列工作程序。我在 supervisor
不可用的某些项目中使用了以下代码,而且我从未遇到过任何问题。
class Kernel extends ConsoleKernel
{
// define your queues here in order of priority
protected $queues = [
'notifications',
'default',
];
protected function schedule(Schedule $schedule)
{
// run the queue worker "without overlapping"
// this will only start a new worker if the previous one has died
$schedule->command($this->getQueueCommand())
->everyMinute()
->withoutOverlapping();
// restart the queue worker periodically to prevent memory issues
$schedule->command('queue:restart')
->hourly();
}
protected function getQueueCommand()
{
// build the queue command
$params = implode(' ',[
'--daemon',
'--tries=3',
'--sleep=3',
'--queue='.implode(',',$this->queues),
]);
return sprintf('queue:work %s', $params);
}
}
我已经在 hostinger 上部署了我的 laravel 应用程序,它有一些队列作业(如发送电子邮件),我使用 artisan 命令 "queue:work" 添加了一个 cron 作业并且它正在执行每 1 分钟。我做了一些研究,我看到有人说它会消耗大量 RAM - 特别是因为我的 cron 作业设置为每 1 分钟执行一次 artisan 命令。 如果写错了怎么办?
您应该考虑实施 supervisor
来为您监控队列工作人员。
https://laravel.com/docs/5.8/queues#supervisor-configuration
To keep the queue:work process running permanently in the background, you should use a process monitor such as
Supervisor
to ensure that the queue worker does not stop running.
高 RAM 使用率通常与 --daemon
标志有关。然而,这可以通过偶尔使用 queue:restart
简单地重新启动队列工作程序来解决。但是如果使用得当,daemon worker 是最有效的,因为它们不会 "reboot" 为每个新工作申请。
https://laravel.com/docs/5.8/queues#running-the-queue-worker
Daemon queue workers do not "reboot" the framework before processing each job. Therefore, you should free any heavy resources after each job completes. For example, if you are doing image manipulation with the GD library, you should free the memory with
imagedestroy
when you are done.
如果由于共享主机限制而无法实施 supervisor
,可以使用一些变通方法,例如使用 withoutOverlapping()
选项仅在前一个队列工作程序死亡时才启动新的队列工作程序。我在 supervisor
不可用的某些项目中使用了以下代码,而且我从未遇到过任何问题。
class Kernel extends ConsoleKernel
{
// define your queues here in order of priority
protected $queues = [
'notifications',
'default',
];
protected function schedule(Schedule $schedule)
{
// run the queue worker "without overlapping"
// this will only start a new worker if the previous one has died
$schedule->command($this->getQueueCommand())
->everyMinute()
->withoutOverlapping();
// restart the queue worker periodically to prevent memory issues
$schedule->command('queue:restart')
->hourly();
}
protected function getQueueCommand()
{
// build the queue command
$params = implode(' ',[
'--daemon',
'--tries=3',
'--sleep=3',
'--queue='.implode(',',$this->queues),
]);
return sprintf('queue:work %s', $params);
}
}