お疲れ様です。ギークフィードエンジニアのサミーラです。私は2.5年間ぐらいLaravelフレームワークでWEBシステム開発をしています。
Laravelによるプロジェクトの経験
- 通話録音システムの制御および表示Webシステム
 - モバイルゲームのバックエンドシステム
 - WEB電話帳システム
 - IP-PBXのWEBプロビジョニングシステム。
 
Introduction
LaravelのQueueを使用して、PHPのバックグラウンド処理ができる方法について、Laravelでバックグラウンド処理のブログで話した時にworkerプロセスについても話しました。
workerプロセスはartisanコマンドで実行できますけど、いろいろな原因でworkerが停止になる可能性があります。そうなると新しくQueueに入るJOBが処理されなくなります。(JOB実行のためにWorkerがないので。。)
上の現象が問題ですよね。。でも、解決できる方法がありますよ。。そのためにSupervisorというプロセス管理システムを使用することができます。
この記事でSupervisorを使用してworkerプロセスを管理する方法について話します。
これらはlaravelの基本的な知識で行うことができます。あと、この記事に関するテストをした環境は
- Centos 7.6
 - PHP 8
 - Laravel 8.0
 - MySQL 15.1 Distrib 10.3.12-MariaDB
 
LinuxにSupervisorをインストールする方法
以下のステップでSupervisorをCentosにインストールすることができます。
- sudo yum update -y
 - sudo yum install epel-release
 - sudo yum update
 - sudo yum -y install supervisor
 - sudo systemctl start supervisord
 - sudo systemctl enable supervisord
 - sudo systemctl status supervisord
 
Supervisorの設定
SupervisorをインストールするとCentosで「/etc/supervisord.conf」ファイルが作成されます。以下の行をsupervisord.confに入れたら、プロセス管理設定ができます。
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/myproject/artisan queue:work --queue=worker_queue --delay=10 --tries=5 autostart=true autorestart=true user=apache numprocs=8 startsecs=0 redirect_stderr=true stdout_logfile=/var/log/appname/worker.log stopwaitsecs=3600  | 
					
- program ➔ プロセスを指定する任意の名前
 - command ➔ 実行したいコマンド
 - autostart ➔ trueの場合はSupervisorを再起動する時に対象のプロセスも自動的に再起動される
 - autorestart ➔ trueの場合はプロセスが停止されると自動的に再起動される
 - user ➔ プロセスを実行するユーザー
 - numprocs ➔ 非同期で実行したいプロセス数
 - startsecs ➔ プロセス開始からRUNNINGまでの秒数
 - redirect_stderr ➔ trueの場合はプロセスのstderrがstdoutへリダイレクトされる
 - stdout_logfile ➔ stdoutを出力したいファイルのフルパス
 - stopwaitsecs ➔ プロセスを強制終了するまでの秒数
 
★上のコマンド(command)だとLaravelプロジェクトでworker_queueを対象にしてworkerプロセス8個が実行されて監視されます。
★Exceptionでプロセスが失敗されると「–tries=5」なので5回リトライされる。リトライされる時に毎回10秒「–delay=10」後にリトライされる。
★「startsecs=0」に設定しないと、例えば:startsecs=1(デフォルト)の場合は1秒前にExceptionが発生したらworkerプロセスがfailedステータスになってexitになる可能性があります。それで、Supervisorの「startretries=3(デフォルト)」設定でworkerが3回再起動されて、その後にworker再起動を諦めます。
★stopwaitsecsが一番長い時間処理されるJOBの時間以上の値に設定しないとJOBが処理中でKILLされる可能性があります。
参照
Supervisorのまとめ
LaravelのQueue機能でJOBを処理する時に継続的に処理されるため、JOB実行するworkerプロセスの監視システムが必要です。そのためにlinuxのSupervisorを使用する必要があります。
ALL THE BEST!!! HAPPY & CLEAN CODING!!!
- SupervisorでLaravelのQueue worker管理 - 2021-07-27
 - Laravelでバックグラウンド処理。。。 - 2021-03-22
 - NATファイアウォール背後のサーバーをZabbixで監視するTips - 2020-09-09
 - Laravelのパフォーマンスを向上しましょう - 2019-12-02
 - Laravelのサービスプロバイダーの仕組みやメリットとは - 2019-09-04
 
【採用情報】一緒に働く仲間を募集しています
                                    
																											
								




