目次
Laravelの記事一覧は下記
PHPフレームワークLaravelの使い方
Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています
キュー
実行したい処理(ジョブ)をjobsテーブル(キュー)に入れて置き、後で実行するものです
前提条件
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています
Laravelでデータベースを扱う準備をする
Laravelでテーブル作成
Laravelで初期データ投入
本記事は上記の内容を理解している前提で書かれています
本記事は上記ので作成したデータベースとレコードを使用します
jobsテーブル生成
コマンドラインで
sample
php artisan queue:table
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/database/migrations/xxxx_xx_xx_xxxxxx_create_jobs_table.phpが現れます
マイグレーション実行
コマンドラインで
sample
php artisan migrate
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
jobsテーブルができました
データベースを使うように設定
/sample/.env修正
‥‥
QUEUE_CONNECTION=database
‥‥
QUEUE_CONNECTIONをdatabaseにします
この値は
/sample/config/queue.phpで使われます
ジョブ生成
(1) コマンドラインで
sample
php artisan make:job SampleJob
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/app/Jobs/SampleJob.phpが現れます
(2) SampleJob.php修正
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SampleJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $sample;
public function __construct($sample)
{
$this->sample = $sample;
}
public function handle()
{
error_log("SampleJob " . $this->sample . PHP_EOL, 3, __DIR__ . DIRECTORY_SEPARATOR . "SampleJob.log");
}
}
コンストラクタとメソッドを修正しました
handleメソッドはジョブが処理されるときに呼びだされます
error_log関数でSampleJob.phpと同階層のSampleJob.logというファイルに文字列を出力するようにしています
Controllerにメソッド追加
(1) /sample/app/Http/Controllers/SampleController.phpにuse文を追記
use App\Jobs\SampleJob;
(2) /sample/app/Http/Controllers/SampleController.phpにjobメソッドを追記
public function job()
{
SampleJob::dispatch("afterResponse")->afterResponse();
SampleJob::dispatch("delay 3 Seconds")->delay(now()->addSeconds(3));
return view('sample.job');
}
SampleJob::dispatchの引数に渡しているものはSampleJobクラスのコンストラクタの引数になります。
afterResponseはブラウザにレスポンスを送り終えたらジョブを実行するものです
delayは指定した引数時間後にジョブを実行します。delayの引数に渡しているnow()はLaravelが提供しているヘルパ関数でCarbonクラス(https://carbon.nesbot.com/)を返します。今回はaddSeconds(3)で3秒後にジョブが実行されるようにしています。addSecondsの他にもいろいろ関数があります(carbon Docs Addition and Subtraction)
SampleJob::dispatch("delay 3 Seconds")->delay(now()->addSeconds(3));
で先ほど作成したjobsテーブルにジョブがinsertされます
(3) /sample/routes/web.phpに下記を追記
Route::get('sample/job', 'SampleController@job');
viewの作成
/sample/resources/views/sample/job.blade.phpファイル作成
<html>
<head>
<title>sample</title>
</head>
<body>
job
</body>
</html>
キューワーカーの起動
キューワーカーとは、キュー(jobsテーブル)に投入されたジョブを処理してくれるものです
sample
php artisan queue:work
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
これは常時実行させておくものです。本番ではSupervisor等で常時動くように設定してください(http://supervisord.org/)(Laravel 7.x キュー Supervisor設定)
また、ジョブを修正した場合はキューワーカーを再起動してください
キューワーカーの再起動コマンドです
php artisan queue:restart
(Laravel 7.x キュー キューワーカーのデプロイ)
動作確認
http://localhost/laravelSample/sample/job
MySQLでlaravel_sampleデータベースを確認してみましょう
select * from jobs;
3秒後に実行されるジョブが入っています
ジョブが実行されるとレコードはdeleteされます
/sample/app/Jobs/SampleJob.logが作成され、afterResponseもdelay 3 Secondsも出力されています