队列(基于Redis)简单应用
在 .env
中设置队列驱动为Redis:并设置好 Redis 的连接等
创建一个任务 php artisan make:job InfoJobs
生成的相应文件为 app/Jobs/InfoJobs.php
该任务只做一个很简单的事情,将传递过来的数据入库
protected $info;
public function __construct($info) {
$this->info = $info;
}
public function handle() {
file_put_contents('info_jobs.txt', $this->info . "\n", FILE_APPEND);
dump($this->info);
}
分发任务
在相应控制或者命令中进行分发
use App\Jobs\TestJobs;
private static function type20() {
for ($i = 0; $i < 10; $i++) {
// 队列名为 info ,运行为:php artisan queue:work --queue=info
InfoJobs::dispatch($i + 100)->onQueue('info');
}
}
启动队列
php artisan queue:work --queue=info
可以看到输出,在文件中也能看到相应信息。
在 Linux 上可以通过守护进程来配置多进程处理
Windows 上你就多开几个窗口吧
队列高级应用
延时分发
// 延时分发,当前时间往后推迟1分钟
$job = (new TestQueue($id))->delay(Carbon::now()->addMinute(1))->onQueue('test');
任务链
SaveUserInfo::withChain([
new Test1,
new Test2
])->dispatch();
指定队列和连接
// 指定队列,一般用默认的就行,这个名字就是将多个队列好区分开来
SaveUserInfo::dispatch($redis_key)->onQueue('emails');
// 指定连接
SaveUserInfo::dispatch($redis_key)->onConnection('database');
最大失败次数、基于时间次数
php artisan queue:work --tries=3
或者在队列类代码中添加一个公共属性 public $tries = 5;
// 基于时间次数
/**
* 指定时间内允许任务的最大尝试次数
* *
* @return \DateTime
*/
public function retryUntil() {
return now()->addSeconds(5);
}
超时
php artisan queue:work --timeout=30
或者在队列类代码中添加一个公共属性 public $timeout = 60;
频率限制
这个先略过
失败的任务
任务事件
通过 Queue 门面提供的 before 和 after 方法可以在任务被处理之前或之后指定要执行的回调。这些回调可用来记录日志或者记录统计数据。通常,你可以在服务提供者中使用这些方法。比如,我们可能在 AppServiceProvider 这样用:
<?php
namespace App\Providers;
//use App\Events\JobSaveUserInfoAfter;
//use App\Events\JobSaveUserInfoFailed;
//use Illuminate\Support\Facades\Queue;
//use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider {
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot() {
// 修改数据库字符串长度限制,执行 migration 时出错用到
// Schema::defaultStringLength(255);
// 任务失败事件
// Queue::failing(function (JobSaveUserInfoFailed $failed) {
// $data = [
// 'connectionName' => $failed->connectionName,
// 'job' => $failed->job,
// 'event' => $failed->exception,
// ];
// });
// 通过 Queue 门面提供的 before 和 after 方法可以在任务被处理之前或之后指定要执行的回调。
// 这些回调可用来记录日志或者记录统计数据。通常,你可以在服务提供者中使用这些方法。
// Queue::after(function (JobSaveUserInfoAfter $event) {
// $event->connectionName;
// $event->job;
// $event->job->payload();
// });
}
/**
* Register any application services.
*
* @return void
*/
public function register() {
//
}
}
守护进程 Supervisor
详情请看下章的介绍