前言:
最近在学习 laravel 框架,学习的版本是 7.15.0 ,记录一下学习过程中遇到的问题和难点以及一些总结。
简介
Laravel 队列为不同的后台队列服务提供了统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系型数据库的队列。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和响应的时间。
Redis
要使用 redis 队列驱动,需要在配置文件 config/database.php 中配置 Redis 数据库连接。
阻塞
使用 Redis 队列时,可以使用 block_for 配置项来指定驱动在迭代队列进程循环并重新轮询 Redis 数据库之前等待可用队列任务的时间。
配置
在 .env 中配置重要的配置项。
QUEUE_CONNECTION=redis
在 config\queue.php 中进行 redis 配置。
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => 5,//设置该值为5来告诉驱动在等待可用队列任务时需要阻塞五秒
],
前期的准备工作
1.安装 redis
redis 下载地址:点击下载
选择 Redis-x64-3.0.504.zip压缩包到 C 盘。
解压完成以后在当前文件夹下使用命令行窗口运行命令。
redis-server.exe redis.windows.conf
输入之后,会显示如下界面:
打开的默认端口为 6379。
不要关闭这个窗口,不然就无法访问服务端了。(其实也可以直接双击redis 目录下的redis-sever.exe)
2.在 php.ihi 中添加 redis 扩展
[Redis]
extension=redis
3.或者使用最新版 phpstudy pro 进行 redis 配置
redis 管理工具 Redis Desktop Manager
参考下边这篇文档:https://www.jianshu.com/p/6895384d2b9e
创建任务
所有的任务类都保存在 app/Jobs 目录。
如果初始化框架的时候 app/Jobs 不存在,通过命令创建任务会自动生成文件夹。
php artisan make:job ProcessPodcast
ProcessPodcast.php 中的代码如下:
<?php
namespace App\Jobs;
use App\Http\Model\Admin\AdminModel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
//定义变量
protected $admin;
/**
* Create a new job instance.
* 构造方法
* @return void
*/
public function __construct(AdminModel $admin)
{
$this->admin = $admin;
}
//进行逻辑处理
public function handle()
{
$admin = $this->admin;
dump($admin);
}
}
在控制器中进行队列消息分发:
TestEventController.php
<?php
namespace App\Http\Controllers;
use App\Events\TestEvent;
use App\Http\Model\Admin\AdminModel;
use App\Jobs\ProcessPodcast;
use Illuminate\Routing\Controller as BaseController;
class TestEventController extends BaseController
{
/**
* 测试队列消息分发
* @return void
*/
public function actionTestRedis()
{
$admin = AdminModel::first();
//onQueue 指定队列的名称,调用时候使用默认的default
$res = ProcessPodcast::dispatch($admin)->onQueue('testRedis');
}
}
在命令行中运行或者在编辑器终端中运行:
//testRedis 为队列的名称,默认为default
php artisan queue:work --queue=testRedis
在接口调试工具 Apizza 中调用接口,在命令行或者终端中出现结果。
任务中间件
任务中间件允许你在执行队列任务前封装一些自定义逻辑,从而减少任务本身的模板代码量。
在 app/Jobs 的目录下新建 Middleware 文件夹用来存放中间件 RateLimited.php 。
<?php
namespace App\Jobs\Middleware;
use Illuminate\Support\Facades\Redis;
class RateLimited
{
/**
* 限定每五秒钟只能处理一个任务
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () use ($job, $next) {
// Lock obtained...
$next($job);
}, function () use ($job) {
// Could not obtain lock...
$job->release(5);
});
}
}
使用方法:
在创建的任务类 ProcessPodcast.php 中进行使用,需要放在 handle 方法的前边。
/**
* 使用 中间件
*
* @return array
*/
public function middleware()
{
return [new \App\Jobs\Middleware\RateLimited];
}
测试前记得重启队列,每次修改任务类都需要重启。
php artisan queue:restart
本次只是初步实现了 Laravel 中队列的基本使用方式,后续可以结合事件进行使用。