laravel佇列之Supervisor守護程式(centos篇)

她來聽我的演唱會發表於2021-02-23

前言

unbutun和centos均為linux系統,官方為我們提供了Homestead可以很好的模擬在伺服器中的開發和執行。之前寫了一篇基於Homestead(unbutun)關於Supervisor守護程式的文章:
laravel佇列之Supervisor守護程式(unbutun篇)
那麼在正式環境中,如何使用呢?(在此建議使用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 

配置

centosunbutun的配置有差異。

在homestead的unbutun中,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(unbutun)/etc/supervisor/supervisor.conf(unbutun)兩者差異:

一個是載入.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 協議》,轉載必須註明作者和本文連結

相關文章