laravelでbroadcast機能を使う際、以下の2パターンとなる
・Pusherjsやablyなどの外部サービスを使う場合
・laravel-websocketsやsocketiなどで自前で用意する場合
外部サービスは制限が有ったりするので自前で用意してみる
laravel-websockets
今回は別ドメイン(ws.test.jp)で用意する
laravel-websocketsサーバはlocalhost(127.0.0.1)、ポート6001で待ち受ける。
外部からのアクセスはnginxのリバースプロキシーでアクセスさせる。
また、ふぃあるのアクセス権などの設定のため
ユーザー名(rockyos)でnginxグループに追加しておく。
laravelプロジェクトの作成
rootでフォルダを作ってそのあとアクセス権限などを設定する。
# cd /var/www/html
# composer create-project "laravel/laravel" ws.test.jp
# chown rockyos:nginx -R ./ws.test.jp
$ cd /var/www/html/ws.test.jp
$ find ./storage -type d -exec chmod g+s {} \;
$ find ./bootstrap/cache -type d -exec chmod g+s {} \;
redisサーバを用意
Centos(RHEL)系ならdnfのmodule listにredisがあるのでそちらからインストール
$ sudo dnf module list redis
$ sudo systemctl enable redis
$ sudo systemctl start redis
redisのcliはredis-cliでコマンドラインに入れる。
$ redis-cli
127.0.0.1:6379> keys *
laravelのイベントを非同期で扱う場合、.envのQUEUE_CONNECTIONをredisに変更する
QUEUE_CONNECTION=redis
PHPのredisライブラリをインストール
$ composer require predis/predis
以下のファイルのREDIS_CLIENTのデフォルト値を変えるか
.env
ファイルにREDIS_CLIENT=predis
を追加する
'redis' => [
'client' => env('REDIS_CLIENT', 'predis'), /* 'phpredis' -> 'predis' */
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
イベントを処理するキューワーカーを設定
QUEUE_CONNECTIONをredisやdatabaseに変更すると、要求されたeventやjobは指定されたdbのテーブル(databaseだとjobs)にキューイングされる。
キューイングされたイベントはキューワーカーによって処理をする。
RHEL系だとsupervisorによるデーモン化を行う必要がある。
まず、supervisorデーモンをOSにインストール。
$ sudo dnf install supervisor
$ sudo systemctl enable supervisor
$ sudo systemctl start supervisor
以降、supervisor自体のサービスのrestartなどは行わず、
supervisorctlコマンドで個々のモジュールの起動、停止などを行う。
設置ファイルの置き場は/etc/supervisord.d/
配下、
ファイル名はとりあえずlaravel-worker.ini
とする
以下はlaravelのキューワーカーの設定例
[program:laravel-queue-worker]
command=php /var/www/html/app/artisan queue:work --sleep=10 --tries=3
autostart=true
autorestart=true
user=nginx
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/app/storage/logs/laravel-worker.log
ファイルを格納したら、設定を更新して起動させる
設定ファイルを変更したら更新させる
$ sudo supervisorctl update
supervisorが管理しているデーモンの状態表示
$ sudo supervisorctl status
laravel-queue-worker:laravel-queue-worker_00 RUNNING pid 777495, uptime 1:43:13
デーモンの停止
$ sudo supervisorctl stop laravel-queue-worker:*
laravel-queue-worker:laravel-queue-worker_00: stopped
デーモンの起動
$ sudo supervisorctl start laravel-queue-worker:*
laravel-queue-worker:laravel-queue-worker_00: started
キューが捌けない場合はsupervisorctl update(or stop start)するとキューが捌けていくことがある。