第一步:.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