【Laravel】ジョブ、キューの実装
キュー
待ち行列。Laravelの動作を待っている処理行列があるようなイメージか
待ち時間の長い処理をすぐやらず、バックグラウンドで実行してくれる。
始めるために、まずはjobsテーブルを生成する。
php artisan queue:table
database/migrations/2023_02_15_224540_create_jobs_table.phpが生成されるので、migrateする。
ジョブ
ユーザーがコンピュータに依頼する仕事の単位のこと。
複数のプロセスをひとまとめにしたもので、プログラムの実行単位を意味する。
ジョブクラスを作る。
php artisan make:job WriteLogFile
app/Jobs/WriteLogFile.php
実行するとログに書き込むような、簡易的なjobを作成することにする。
コントローラに記述してみる
code:StudyController.php
// ちゃんと名前空間に使用するJobを記入しておく
use App\Jobs\WriteLogFile;
public function DispatchWriteLogJob() {
$message = 'controller test';
// これで呼ぶ
dispatch(new WriteLogFile($message));
}
ジョブの内容
code:WriteLogFile.php
class WriteLogFile implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $monolog;
protected $message;
public function __construct($message)
{
$this->message = $message;
// ログ設定
// $log_path = storage_path() . '/logs/write_log_file.log';
$log_path = storage_path() . '/logs/monolog.log';
$this->monolog = new Logger('write_log_file');
$this->monolog->pushHandler(new StreamHandler($log_path, Logger::INFO));
}
public function handle()
{
//
$this->monolog->info($this->message);
}
}
ログは書かれるが、キューの実行描写がターミナルで見られない
どうやったらキューに入ったことを確認し、queue:startで実行できるんだろう?
↑の書き方はLaravel5.3のものだが、かあスレは6.2で、参考にしているもののverは5.5。
結構バージョンによって書き方が変わっているっぽい
code:php
// 5.3
dispatch(new WriteLogFile($message));
// 5.5, 6.0
WriteLogFile::dispatch($message);
これは直接関係はなく、下記の手順を踏めばできた。↓
JobをDBに貯めておく手順
.envのQUEUE_CONNECTIONを操作すればできた。
code:.env
# 恐らく、ジョブの格納場所を決める環境変数。syncは即時実行だが、databaseはDBに貯めて実行するような形になる
QUEUE_CONNECTION=database
syncとは
queue:listen
ジョブの編集を行なった場合queue:restartののちにqueue:workをする必要があるが、それを無くす。
都度変更が更新される処理のような流れになる。
処理速度自体は遅めなので開発用