laravel队列之Supervisor守护进程(centos篇)

前言#

ubuntu 和 centos 均为 linux 系统,官方为我们提供了 Homestead 可以很好的模拟在服务器中的开发和运行。之前写了一篇基于 Homestead(ubuntu)关于 Supervisor 守护进程的文章:
laravel 队列之 Supervisor 守护进程 (ubuntu 篇)
那么在正式环境中,如何使用呢?(在此建议使用 docker,谁用谁知道)

附:#

参考文章:
centos7 安装 supervisor 详细教程
Centos7 中使用 Supervisor 守护进程
EPEL 源 - 是什么全称
centos 7 使用 supervisor 管理 laravel 队列

开始#

一、安装#

1. 执行安装 EPEL 源(详情可以查看参考文章:EPEL 源 - 是什么全称):#
#安装EPEL源,详情可以查看参考文章
yum install epel-release

选择 y 或者 d(yes 和 default)

2. 安装 supervisor#
yum install -y supervisor

3. 开机自启动#
systemctl enable supervisord

4. 启动 supervisord 服务#
systemctl start supervisord

5. 查看 supervisord 服务状态#

systemctl status supervisord 

配置#

centosubuntu 的配置有差异。

在 homestead 的 ubuntu 中,Supervisor 配置文件通常存储在 /etc/supervisor/conf.d 目录(默认有这 supervisor 目录)。在此目录中,你可以创建任意数量的配置文件,这些配置文件将指示 supervisor 如何监视你的进程。supervisor.conf 是存放于 supervisor 目录下,和 conf.d 同级;conf.d 一般是存放自定义队列进程配置文件。
而在 centos 中,没有 conf.d 文件夹,只有 supervisor.confsupervisor.d 目录:

/etc/supervisor/conf.d/supervisor.conf(ubuntu)/etc/supervisor.d/supervisor.conf(centos)两者差异:

一个是加载.conf 文件,一个是.ini 文件,注意区别。当然,如果你把配置文件放置在自定义位置,请记得修改 supervisor.conf 的路径。

配置文件:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
#指令 /home/vagrant/code/test请替换成自己项目路径
command=php /home/vagrant/code/test/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

注意#

这里可能会有一个坑
在队列文件 worker.log 和 laravel.log 中会有报错信息,不处理的话会一直写入:

pcntl_signal() has been disabled for security reasons
at xxx/vendor/laravel/framework/src/Illuminate/Queue/Worker.php:643
pcntl_alarm()has been disabled for security reasons
at xxx/vendor/laravel/framework/src/Illuminate/Queue/Worker.php:643

这是因为在 centos 的 php 中,这两个函数是默认禁用的,如果使用宝塔面板,可以在 php→设置→禁用函数中找到这两个函数,删除即可;
或者可以在 php.ini 中找到 disable_functions,找到两者,删除即可,两种方法效果一样。

使用#

用上一篇文章的代码:

控制器:#
use App\Jobs\FlowQueue;
$user = [
    'uid'=>1,
    'name'=>'李大',
    'phone'=>'1399999999',
    'score'=>[
        'chinese'=>(double)1100,
        'math'=>(double)1000,
        'english'=>(double)900,
    ],
    '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);
    }
}

执行结果:

队列日志:

至此,centos 篇的 Supervisor 守护进程完成。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。