Laravel 队列为不同的后台队列服务提供统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系型数据库的队列。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和相应的时间。
实现一个例子,通过这个例子你会明白laravel队列是怎么回事:
1,来一张数据表来存储任务,jobs
php artisan queue:table php artisan migrate
2,在来一张队列任务失败的存放表,failed_jobs
php artisan queue:failed-table php artisan migrate
3,查看配置文件
队列配置文件存放在 config/queue.php 文件中。每一种队列驱动的配置都可以在该文件中找到,包括数据库, Beanstalkd, Amazon SQS, Redis,以及同步(本地使用)驱动。其中还包含了一个 null 队列驱动用于那些放弃队列的任务。
开发的时候 .env QUEUE_DRIVER=sync 可以即时看到执行结果,生产环境 QUEUE_DRIVER=database 会存到队列表
4,生成任务类
php artisan make:job ProcessPodcast
队列的任务类都默认放在 app/Jobs 目录下
类代码:
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\DB; class ProcessPodcast implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private $data; /* Create a new job instance. @return void / public function __construct($data) { $this->data = $data; } /* 执行任务。 @return void / public function handle() { $data = $this->data; DB::table('zwotu')->insert($data); } /* 执行失败的任务。 @param Exception $exception @return void / public function failed(Exception $exception) { // 给用户发送失败的通知等等... } }
5,分发任务,在你的控制器中调用
$data = ['content' => 'conte1111t']; $job = (new ProcessPodcast($data))->dispatch($data)->delay(now()->addMinutes(1)); //延迟1分钟调用
6,运行队列处理器
php artisan queue:work --tries=3 #tries:失败后尝试重试的次数,次数超出会存在失败表failed_jobs中
7,去运行你分发任务的控制器
8,观看你的任务执行结果和jobs表
9,一个简单的队列任务完成
更多使用参考以下网址:
https://laravel-china.org/docs/laravel/5.7/queues/2286
https://baijiahao.baidu.com/s?id=1589562735594469778&wfr=spider&for=pc
https://laravel-china.org/articles/3729/use-laravel-queue-to-understand-the-knowledge