LoginSignup
9
9

More than 5 years have passed since last update.

Laravel5.5 で非同期処理(Queue)を実装【sync編】

Last updated at Posted at 2018-02-07

環境

  • 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編】

参考

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9