August 3, 2021 • ☕️ 6 min read
【 環境 】
Laravel のバージョン: 8.16.1
PHP のバージョン: 7.4.7
MySQL のバージョン: 5.7  
Event, Listener, Dispatcher, Job, Queue …
何やら複雑に絡み合う事が多い、バックグラウンドで処理をさせる時に使う事が多いパーツですが、結構いい加減に使っていたので整理してみました。
何かしらの動作や変更などが発生した際に発信されるもの。
発生時の情報をオブジェクトとして表現する。  
イベントに対応する処理を実行する機能。
サーバサイドで同期的に処理 or キューと組み合わせて非同期で実行可。
イベントを発行する機能。
リスナークラスの実装次第で、サーバサイドでリスナーを起動させるか、socket.io(websocket)を通してWebブラウザに実行させるかをディスパッチャーが振り分ける。  
また、event ヘルパー関数を通して利用する事もできる。
ジョブを貯めておく箱。
貯めておいたジョブを順番に処理する。  
キューに放り込まれる何らかの処理。
ユーザが応答を待たず、バックグラウンドプロセスで動かしたいもの。  
前々回の続き。
イベントとリスナーを使ったので、今度はイベントとキューを使ってみる。
キューは database を使用しています。詳細は前回を参照。
artisan コマンドで、イベントとリスナーを作成。
php artisan make:event App\\Events\\MyEvent04
php artisan make:listener MyListener04 --event MyEvent04    protected $listen = [
        \App\Events\MyEvent04::class => [
            \App\Listeners\MyListener04::class
        ],
    ];クラス名の末尾に追記。
class MyListener04 implements ShouldQueue
{前回同様、routes\api.php に書いてみる。
my-event04 の URL を叩くとイベントが起動するようにしています。  
// http://localhost:8000/api/my-event04
Route::get('my-event04', function(){
    \App\Events\MyEvent04::dispatch();
    return 'my-event04';
});キャッシュをクリアしないと、変更内容が反映されない事があります。
php artisan cache:clear
php artisan route:clearその後、
「http://localhost:8000/api/my-event04」
の URL を叩く。  
キューを database に指定していると、「jobs」というテーブルを参照すると、キューに溜まった内容を確認できます。
payload の中身は長いので、適当な位置で切っています。
| id | queue | payload | attempts | reserved_at | available_at | created_at | 
|---|---|---|---|---|---|---|
| 1 | default | {“uuid”:“fb5ef934-a918”,“displayName”:“MyListener04”,“job”:“CallQueuedHandler@call”, | 0 | « NULL » | 1627686058 | 1627686058 | 
キューを捌くためのコマンドを実行
php artisan queue:workこうやって始めて、リスナーの handle メソッドが動くようになります。
ワーカー実行後は、jobs テーブルのレコードが削除されます。(redis や file を使用している場合、key と value が削除されます)  
こんな感じでリスナーにログを出力する処理でも記述しておくと、
「イベントが発火した瞬間は、ログに何も出力されない」
「キューのワーカーを動かすと、ログに出力される」
という動作が確認できます。  
    public function handle(MyEvent04 $event)
    {
        \Log::info(__METHOD__);
    }