问题一、为什么使用队列?
一般来说:1.异步 2.重试
问题二、什么情况使用队列?
简单举例:
1.耗时比较久,如上传一个文件后进行一些格式的转化等
2.需要保证送达率,比如发送短信,因为要调用别人的api,总会有几率失败,那么为了保证送达,重试就必不可少了
lumen队列的配置和使用:
队列的配置在
.env
中
QUEUE_DRIVER
选项里,暂时用database
如果你想完全自定义配置信息,你可以复制
vendor/laravel/lumen-framework/config/queue.php
整个文件到
config/queue.php
中,根目录如果没有
config
的话你应该创建一个。
添加队列表:
$php artisan make:migration create_jobs_table --create=jobs
- Schema::create('jobs',function(Blueprint$table) {
- $table->bigIncrements('id');
- $table->longText('payload');
- $table->tinyInteger('attempts')->unsigned();
- $table->tinyInteger('reserved')->unsigned();
- $table->unsignedInteger('reserved_at')->nullable();
- $table->unsignedInteger('available_at');
- $table->unsignedInteger('created_at');
- $table->index(['queue','reserved','reserved_at']);
添加失败队列表:
$php artisan queue:failed-table
可在database/migrations里看到一个create_failed_jobs_table.php
更新迁移文件
$php artisan migrate
数据库里多了failed_create_jobs
在使用列表里的队列服务前,必须安装以下依赖扩展包:
- Amazon SQS:aws/aws-sdk-php ~3.0
- Beanstalkd: pda/pheanstalk ~3.0
- Redis: predis/predis ~1.0
在composer.json中添加:
- "aws/aws-sdk-php":"~3.0",
Lumen 中没有可用来生成事件监听器的命令,你可以复制
ExampleJob
文件,这个示例文件提供了基础的类结构,你可以作为参考。基类
Job
已经加载了我们需要的 traits
InteractsWithQueue
,
Queueable
, 和
SerializesModels
:
<?php
namespace App\Jobs;
class ExampleJob extends Job
{
protected $str;
/**
* Create a new job instance.
* 创建一个新的任务实例
* @return void
*/
public function __construct($str)
{
//
$this->str = $str;
}
/**
* Execute the job.
* 运行任务
* @return void
*/
public function handle()
{
//
echo 'hellow '.$this->str;
}
}
在任意一个控制器中
- dispatch(newExampleJob('WJB'));
在php—cli模式下
运行队列监听器
$php artisan queue:listen
此时队列已在监听中
再访问该控制器
如下
[2017-03-20 06:31:53] Processing: App\Jobs\ExampleJob
hellow WJB[2017-03-20 06:31:53] Processed: App\Jobs\ExampleJob
注:
queue:work
默认只执行一次队列请求, 当请求执行完成后就终止;queue:listen
监听队列请求, 只要运行着, 就能一直接受请求, 除非手动终止;queue:work --daemon
同 listen
一样, 只要运行着, 就能一直接受请求, 不一样的地方是在这个运行模式下, 当新的请求到来的时候, 不重新加载整个框架
, 而是直接 fire 动作.
能看出来, queue:work --daemon
是最高级的, 一般推荐使用这个来处理队列监听.使用 queue:work --daemon
, 当更新代码的时候, 需要停止, 然后重新启动, 这样才能把修改的代码应用上.