队列(基于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

详情请看下章的介绍