環境
- CentOS 6.9
- Apache 2.2
- MySQL 5.6
- PHP 7.1
- Laravel 5.5
設定ファイル
必要に応じてデフォルトの設定内容を変更する。
.env
.env
QUEUE_DRIVER=sync
とりあえずデフォルトの sync
のままで進める。
※ sync
の場合は非同期にならないが、
ジョブの動作確認ができるまでは、最初は sync
にしておいて、正常動作が確認できてから、 database
に切り替えることにする。
config/queue.php
config/queue.php
'connections' => [
~省略~
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
~省略~
ここもひとまずデフォルトのままで。
あとで必要に応じて database
の設定項目を変更する。
ジョブクラスの作成
artisanコマンドでジョブクラス
StoreDataFile
(任意のクラス)を生成する。
console
$ php artisan make:job StoreDataFile
app/Jobs/StoreDataFile.php
が生成される。
ジョブクラスの実装
app/Jobs/StoreDataFile.php
class StoreDataFile implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $inputs;
protected $user_id;
/**
* Create a new job instance.
*
* @return void
*/
// public function __construct(Request $request, $user_id) //-- (1)
public function __construct(array $inputs, $user_id) //-- (2)
{
$this->inputs = $inputs;
$this->user_id = $user_id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//ここに非同期で行いたい処理を実装
}
}
ビューで入力した値を利用したかったので、コンストラクタの引数にRequest
クラスを指定していたが(1)、以下のエラーが発生。
Serialization of 'Closure' is not allowed
どうやらシリアライズできないオブジェクト(Request
クラス)を指定することはできない[*]ようなので、
$request->all()
で配列にして渡すようにした (2)。
* eloquentのモデルは例外???
参考:LaravelでMailableなオブジェクトをqueueで送信したら"Serialization of 'Closure' is not allowed"というエラーになった件の解決方法
コントローラからのジョブのディスパッチ
TestController.php
//StoreDataFileジョブをディスパッチ
$this->dispatch(new StoreDataFile($request->all(), auth()->id()));
これでひとまず完成。
database
を利用した非同期処理の実装はまた次回。。。
次回:Laravel5.5 で非同期処理(Queue)を実装【database編】