PHP

laravel5.4队列Demo

第一步:.env文件中设置队列驱动为database,默认sync是直接执行,并不是异步队列。


QUEUE_DRIVER=database

第二步:创建保存队列的表jobs


php artisan queue:table     //生成数据库队列的(laravel 5.2和5.4字段有差异)
php artisan queue:failed-table  //处理失败的队列
migrationphp artisan migrate  //创建该数据库队列表

第三步:运行Artisan命令,生成任务类,/app/Jobs/SendReminderEmail.php


php artisan make:job SendReminderEmail


类代码如下:

<?php

namespace App\Jobs;

use App\User;
use App\Jobs\Job;
use Illuminate\Support\Facades\Log;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendReminderEmail extends Job implements ShouldQueue, SelfHandling
{
    use InteractsWithQueue, SerializesModels;
        protected $data;
    /**
     * 创建一个新的任务实例
     *
     * @param  User  $user
     * @return void
     */
    public function __construct($data)
    {
            $this->data = $data;
    }

    /**
     * 执行任务
     *
     * @param  Mailer  $mailer
     * @return void
     */
    public function handle()
    {
            //Log::info($this->data);
        Log::info('往日志文件里写信息!');
    }
    /**
         * The job failed to process.
         *
         * @param  Exception  $exception
         * @return void
         */
        public function failed(Exception $exception)
        {
            // Send user notification of failure, etc...    
        }
}

第四步:创建控制器,加入队列。/app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Jobs\SendReminderEmail;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;

class UserController extends Controller{
    public function index(){
        Log::info('This is a log demo!');
    }
    /**
     * 发送提醒邮件到指定用户
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function sendReminderEmail($id)
    {
        $user = User::findOrFail($id);
        $job = (new SendReminderEmail($user))
            ->delay(Carbon::now()->addMinutes(1));

        $this->dispatch($job);
    }
}

如果成功会在jobs表有条队列数据。queue默认default,可以调用onQueue('队列名'),指定队列名称。

laravel 5.2的表,5.4里去除了reserved字段。

第五步:启用任务队列


php artisan queue:listen


(0)
分享:

本文由:xiaoshu168 作者:xiaoshu发表,转载请注明来源!

标签:

相关阅读