场景
-
需要耗时的任务
-
为了保证送达率,出错后需要重试的任务
配置
底层配置文件是config/queue.php
如果是用数据库database作队列驱动,就需要一张数据表来存放任务,这些操作都可以使用laravel的数据迁移完成
php artisan queue:table
php artisan migrate
.env
文件中设置队列驱动为数据库
QUEUE_DRIVER=database
编写任务类
运行以下命令将会在app/Jobs
目录下生成一个新的类
php artisan make:job MyJob
打开新创建的类app/Jobs/MyJob
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
class MyJob extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Log::info('队列测试'.date('Y-m-d h:i:s',time()));
}
}
handle
方法在任务被队列处理的时候被调用,注意我们可以在任务的handle方法中进行依赖注入。
推送任务到队列
默认的 Laravel 控制器app/Http/Controllers/Controller.php
使用了DispatchesJobs trait
。所以继承的类中可以直接使用推送任务到队列的方法dispatch
方法
<?php
namespace App\Http\Controllers\Home;
use App\Jobs\MyJob;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class HomeController extends Controller
{
public function index(){
//推送队列
$result = $this->dispatch(new MyJob());
dd($result);
}
}
至此一个队列服务demo就完成了,在浏览器访问路由,队列就会被保存在数据库中
那么接下来如何运行队列中的任务呢?
运行队列监听器
php artisan queue:work --daemon
直接运行该命令即可继续队列中的任务
查看日志storage/logs/laravel.log
,测试成功
[2018-04-26 08:27:05] local.INFO: 队列测试2018-04-26 08:27:05
Windows定时任务
创建一个.bat
文件,写入队列监听的命令
d:
cd D:\WWW\demo
php artisan queue:work --daemon
输入win+R 然后输入 taskschd.msc 进入定时任务设置界面,创建
启动程序一栏填入.bat
脚本路径即可
网友评论