最近在开发授权系统到时候,需要大量生成授权码,一次生成几十万,如果不使用队列那么应用程序肯定直接将卡死了。
这篇文章记录了下队列到使用,希望看到这篇文章到你对laravel对认识有一定对提升。可以在项目内善用队列做到性能对提升。
首先我们需要创建一个 job 可以使用命令 php artisan make:job JobName 来创建
Job AddLicenses.php
下面是Job文件,调用后需要做什么
<?php namespace App\Jobs; use App\Licenses; use App\Project; use Carbon\Carbon; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class AddLicenses implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $nums; /** * Create a new job instance. * 依赖注入 * @return void */ public function __construct(int $nums) { $this->nums = $nums; } /** * Execute the job. * * @return void */ public function handle() { for ($i = 1; $i <= $this->nums; $i++) { $insert[] = [//组建数组 'uuid' => \Str::uuid(), 'key' => \Str::random(32), 'project_id' => $project->id, 'user_id' => $this->user_id, ]; if (count($insert) >= $this->nums) { Licenses::insert($insert); //插入 break; } } } public function failed(\Exception $exception) { // TODO 给用户发送任务失败的通知,等等…… \Log::error($exception); } }
接下来是添加这个队列对控制器Controller
public function createAction(Request $request) { $maxNums = 1000; //一次插入1000条 //验证 $this->validate($request, [ 'project' => 'exists:project,id|int|required', 'num' => 'min:1|max:500000|integer|required', ]); //生成队列任务 $nums = $request['num']; for ($i = 1; $i >= 0; $i += $maxNums) { if ($nums <= 0) { break; } if ($nums >= $maxNums) { //如果大于1000个要添加则添加任务延迟执行 !empty($lestTime) ?: $lestTime = now();//初始化时间 $nextTime = $lestTime->addMilliseconds(100); //添加队列任务 AddLicenses::dispatch($request['project'], \Auth::id(), $request['type'], $maxNums, $status) ->delay($nextTime);//延迟执行 //更新时间 $nums -= $maxNums; $lestTime = $nextTime; } else { //如果小于一千个则立即执行 AddLicenses::dispatchNow($request['project'], \Auth::id(), $request['type'], $nums, $status); $nums -= $nums; } } return redirect(route('licenses.show')); }
上述代码插入一百万行数据大约需要一到两分钟(还是很快的)。
队列的使用方法非常非常的简单,也非常好用。awsl真是个优雅的框架