队列
队列的使用场景,当我们需要执行一些比较耗时或者容易出来故障的任务的时候,这个时候就需要
队列
了 , 故名思义:排队等待执行的列表任务
环境配置 :
日常的配置驱动 :
database redis sqs
在这里我使用的是redis , 所以我们要在
.env
文件中 修改QUEUE_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379
简单使用
创建并使用队列
在
App\Jobs
中创建` php artisan make:job UpdateUserNameJob`
class UpdateUserNameJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. * * @return void */ public function __construct() { $this->delay(Carbon::now()); // 立即执行 } /** * Execute the job. * * @return void */ public function handle() { User::find(1)->update([ 'name' => '22222' ]); } }
在 命令行中输入
php artisan tinker
|| 同时打开一个新的命令窗口,php artisan queue:work
监听队列信息执行
dispatch(new App\Jobs\UpdateUserNameJob());
推入到队列中可以在 队列窗口中 看到
[2018-09-27 07:36:56] Processing: App\Jobs\UpdateUserNameJob [2018-09-27 07:36:56] Processed: App\Jobs\UpdateUserNameJob vagrant@homestead:~/study$ php artisan tinker connectionPsy Shell v0.9.6 (PHP 7.1.7-1+ubuntu16.04.1+deb.sury.org+1 — cli) by Justin Hileman >>> dispatch(new App\Jobs\UpdateUserNameJob()); => Illuminate\Foundation\Bus\PendingDispatch {#2861} >>> App\Models\User::find(1); => App\Models\User {#2873 id: 1, name: "12344", email: "yvonne.considine@example.org", created_at: "2018-09-25 15:11:54", updated_at: "2018-09-27 07:35:29", } >>> App\Models\User::find(1); => App\Models\User {#2885 id: 1, name: "22222", email: "yvonne.considine@example.org", created_at: "2018-09-25 15:11:54", updated_at: "2018-09-27 07:38:32", }
队列即可执行了 ; 当然要保持长队列一直运行,看查阅资料 https://laravelacademy.org/post/8993.html#toc_19 ;
centos && linux 安装使用 supervisor 的方法 (https://www.2cto.com/kf/201712/702837.html)[https://www.2cto.com/kf/201712/702837.html]
详细介绍其他用法
创建任务类
在上面的我已经介绍了如何进行创建,
php artisan make:job UpdateUserNameJob
任务分发
`UpdateUserNameJob::dispatch()`
延迟分发
UpdateUserNameJob::dispatch() ->delay(now()->addMinutes(10)); // delay 接受一个 datetime 参数
任务链
\App\Jobs\UpdateUser1NameJob::withChain([ new \App\Jobs\UpdateUser1NameJob, new \App\Jobs\UpdateUser2NameJob, new \App\Jobs\UpdateUser3NameJob, ])->dispatch(); // // 可以增加指定链接 或者 分发到指定队列名 allOnConnection 和 allOnQueue
队列的优先级
dispatch((new Job)->onQueue('high'));
重新队列
php artisan queue:restart
当然 , 有时候我们需要对我们的一些错误的任务进行处理,laravel 提供了
failed
方法// job ... public function handler(){ } public function failed(){ // 发送失败通知 } 同时任务失败会触发一个事件 // AppServiceProvider .... public function boot () { Queue::failing(function (JobFailed $event) { // $event->connectionName // $event->job // $event->exception }); ... 通过 Queue 门面提供的 before 和 after 方法可以在任务被处理之前或之后指定要执行的回调。这些回调可用来记录日志或者记录统计数据。
-- 原创 转载请注明出处
本文由 邓尘锋 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 4, 2019 at 11:39 am