laravel队列之Supervisor守护进程(ubuntu篇)
前言
众所周知,队列的开启为:php artisan queue:work
,但是一旦关闭命令窗口队列运行就关闭。因此官方推荐Supervisor。具体安装配置使用教程可以参考官方文档。
但是本着兼听则明的原则,还有没有其他可行的方式呢?于是查到一些资料,根据这篇文章:laravel队列常驻运行问题的说法,还可以通过运行php artisan queue:work --daemon
。
看到这里,我不禁拍案而起,大呼一声“妙啊”,但是根据另外一篇文章laravel队列常驻运行问题里一个大佬说的:
“只是放到后台运行而已,如果队列出现致命错误,队列必然挂彩,唯一的解决方法就是通过进程守护的方式实现重启(supervisord)。只要supervisord进程存在,你的队列就能永久的常驻进程。另外,supervisord貌似只支持linux”
然后通过查阅资料发现:
queue:work
默认只执行一次队列请求, 当请求执行完成后就终止;queue:listen
监听队列请求, 只要运行着, 就能一直接受请求, 除非手动终止;queue:work --daemon
同listen
一样, 只要运行着, 就能一直接受请求, 不一样的地方是在这个运行模式下, 当新的请求到来的时候,不重新加载整个框架
, 而是直接 fire 动作.
能看出来,queue:work --daemon
是最高级的, 一般推荐使用这个来处理队列监听.注意: 使用
queue:work --daemon
, 当更新代码的时候, 需要停止, 然后重新启动, 这样才能把修改的代码应用上.
综合上述也就是说平时使用没啥问题,但是遇到致命错误,队列会挂掉,但是如果使用Supervisor,队列挂了,会重新开启。于是决定来跳这个坑。
开始
根据文档,各种安装步骤省略,但是在开启的时候遇到很多问题。
问题:
然后查阅以后发现了这篇文章:使用 Supervisor 管理 Laravel 队列进程,发现了是在/etc/supervisord/conf.d
中的配置文件中指向的Log文件权限不够,以及配置的问题。
laravel-work.conf配置文件:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
//指向的是需要执行的项目的队列,等同于进入/home/vagrant/code/dcat目录再执行:
//php artisan queue:work redis --sleep=3 --tries=3,原配置中redis为sqs,这个是
//队列的连接,你用什么队列就改什么,redis就是redis,rebbitmq就为rebbitmq
command=php /home/vagrant/code/dcat/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
stopwaitsecs=3600
然后chmod -R 777 /home/forge/app.com/worker.log
还有一个地方,就是/etc/supervisord/下的supervisord.conf的一个配置项:[include]
files = /etc/supervisor/conf.d/*.conf
它的意思是指向conf.d下的配置文件,上一篇文章的配置一样,根据具体情况配置即可。
然后开启:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
如果执行到最后一步没有报错且没有
laravel-worker:laravel-worker_00: started
的提示信息,那就执行:
sudo supervisorctl status
查看队列是否开启,如果显示:
laravel-worker:laravel-worker_00 RUNNING pid 3937, uptime 0:05:37
laravel-worker:laravel-worker_01 RUNNING pid 3938, uptime 0:05:37
laravel-worker:laravel-worker_02 RUNNING pid 3939, uptime 0:05:37
laravel-worker:laravel-worker_03 RUNNING pid 3940, uptime 0:05:37
laravel-worker:laravel-worker_04 RUNNING pid 3941, uptime 0:05:37
laravel-worker:laravel-worker_05 RUNNING pid 3942, uptime 0:05:37
laravel-worker:laravel-worker_06 RUNNING pid 3943, uptime 0:05:37
laravel-worker:laravel-worker_07 RUNNING pid 3944, uptime 0:05:37
那么恭喜你,你的队列开启成功。
使用
控制器:
use App\Jobs\FlowQueue;
$user = [
'uid'=>1,
'name'=>'李大',
'phone'=>'1388888888',
'score'=>[
'chinese'=>(double)110,
'math'=>(double)100,
'english'=>(double)90,
],
'type'=>2
];
FlowQueue::dispatch($user);
队列:
class FlowQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $accessLogs;
/**
* Create a new job instance.
*
* @param AccessLog $accessLogs
*/
public function __construct($accessLogs)
{
//
$this->accessLogs = $accessLogs;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
$logs = $this->accessLogs;
AccessLog::create($logs);
}
}
执行结果:
(请忽略mongodb时间差8小时问题,解决办法就是在使用mongodb的模型加入这个:
use DateTimeInterface;
use Illuminate\Support\Carbon;
public function serializeDate(DateTimeInterface $date){
return Carbon::instance($date)->toDateTimeString();
}
)
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: