正文
database 实现
1.修改根目录 .env
文件的 QUEUE_CONNECTION
字段配置为 database
Laravel可配置多种队列驱动,包括 “sync”, “database”, “beanstalkd”, “sqs”, “redis”, “null”(具体参见app/config/queue.php)
其中sync为同步,database为使用数据库,后面三种为第三方队列服务,最后一种为不使用队列。
通过在 .env 中的 QUEUE_CONNECTION 选项,来决定选择何种驱动。
如 QUEUE_CONNECTION=database
即为选择数据库驱动队列。
2.创建数据库队列表(database方式)
为了使用 database 队列驱动,你需要一张数据表来存储任务。
php artisan queue:table
生成队列数据表jobs 的 migrate 迁移文件,然后执行迁移命令
php artisan migrate
3.生成任务类
在你的应用程序中,队列的任务类都默认放在 app/Jobs
目录下。
如果这个目录不存在,那当你运行 make:job Artisan
命令时目录就会被自动创建。
你可以用以下的 Artisan 命令来生成一个新的队列任务:
php artisan make:job ActCheck
4.在队列类里面的handle方法中写上业务逻辑(比如发送网络请求,发送邮件等等,这里简单写个日志代替)
<?php
namespace App\Jobs;
use App\Models\RadioAct;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ActCheck implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $act_id;
/**
* Create a new job instance.
* @param int $act_id
* @return void
*/
public function __construct($act_id)
{
$this->act_id = $act_id;
}
/**
* Execute the job.
*
* @return bool
*/
public function handle()
{
// act记录
$actModel = RadioAct::query()
->where(['id' => $this->act_id])
->first();
// 相关处理逻辑
}
}
5.在控制器中加入一个测试方法,直接调用队列类的 dispatch方法,类似生产了一个队列任务
public function test()
{
$act_id = 10;
ActCheck::dispatch($act_id);
}
这时,由于队列还没开启,数据库的队列表中会有一个任务,等待队列启动后执行
6.执行命令开启队列
php artisan queue:work
user@local# php artisan queue:work
[2021-10-25 20:38:09][47] Processing: App\Jobs\ActCheck
[2021-10-25 20:38:09][47] Processed: App\Jobs\ActCheck
参考资料
Laravel 5.7 中文文档 队列 https://learnku.com/docs/laravel/5.7/queues/2286
Laravel 队列的简单使用例子 https://www.cnblogs.com/shifu204/p/11730558.html
Laravel 学院 > 队列 https://laravelacademy.org/post/22009