laravel5.5+框架中安全的停止关闭运行中的队列
说到laravel就想到优雅二字,那么在laravel框架中如果优雅关闭/停止队列,如何安全的停止工作中的队列呢?
我们来看看队列相关命令
目前 Laravel5.5+未提供关闭队列的命令:
art | grep queue
horizon:clear Delete all of the jobs from the specified queue
horizon:forget Delete a failed queue job
horizon:snapshot Store a snapshot of the queue metrics
queue
queue:batches-table Create a migration for the batches database table
queue:clear Delete all of the jobs from the specified queue
queue:failed List all of the failed queue jobs
queue:failed-table Create a migration for the failed queue jobs database table
queue:flush Flush all of the failed queue jobs
queue:forget Delete a failed queue job
queue:listen Listen to a given queue
queue:restart Restart queue worker daemons after their current job
queue:retry Retry a failed queue job
queue:retry-batch Retry the failed jobs for a batch
queue:table Create a migration for the queue jobs database table
queue:work Start processing jobs on the queue as a daemon
解决方案:
启动队列:
queue:work
有个参数 --stop-when-empty 可以让队列运行完成后退出
运行中的队列
queue:restart
命令会等待队列中的 任务完成后 重启队列(优雅重启)
此命令同样作用于 Supervisor 运行的
queue:work --daemon
不过需要在 supervisor 的配置中加入
autorestart=true 进行设置。
队列 worker & 部署
因为队列 worker 是长生命周期的进程,所以在重启之前,任何的代码更改都不会生效。
因此,使用队列 worker 部署应用程序的最简单方法是在部署过程中重新启动 worker。
你可以通过执行 queue:restart 命令来优雅地重新启动所有的
worker:
php artisan queue:restart
该命令将指示所有队列 worker 在完成当前任务后优雅地 “死亡”,这样就不会丢失现有的任务。
由于在执行
queue:restart
命令时,队列 worker 将被杀掉,因此你应该运行一个进程管理器
(如 Supervisor) 来自动重新启动队列 worker。
技巧:
队列使用 缓存 来存储重启信号,因此在使用该特性之前,
你应该检查应用程序的缓存驱动程序是否正确配置。
相关链接:
https://learnku.com/docs/laravel/8.5/queues/10395#b08a06
相关文章