Laravel使用队列解决插入百万条数据

微信扫一扫,分享到朋友圈

Laravel使用队列解决插入百万条数据
0

最近在开发授权系统到时候,需要大量生成授权码,一次生成几十万,如果不使用队列那么应用程序肯定直接将卡死了。

这篇文章记录了下队列到使用,希望看到这篇文章到你对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真是个优雅的框架

咱很菜的,是个智障。 人设非常容易崩。
下一篇

nominalia.com 1欧元注册.com,.es,.cat

你也可能喜欢

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部