解决think-queue的redis驱动连接超时的问题

在处理think-queue队列中长时间运行的任务(如大量数据的Excel导出)时,可能出现redis连接超时的问题。为了解决这个问题,通过修改think-queue的源代码,添加了reconnect属性,以便在长时间任务中每次操作redis时重新建立连接。涉及修改的文件包括Job.php、Redis.php和Redis.php的connector。这种方法避免了因连接过期导致的错误,提高了任务处理的稳定性。
摘要由CSDN通过智能技术生成

      think-queue队列处理消费时默认的是单个redis实例,如果单个消费处理时间很长,例如我们现在的一个项目用户导出excel报表任务,我每次导20万-500万数据的报表,平均每次任务得五分钟至30分钟,这个很容易出现redis服务端拒绝连接的错误,例如图下

   

因为每次处理消费时think-queue会实例化一个redis实例,在整个处理消费的上下文中都是用那一个redis实例的,但redis服务有默认连接是有有效期的,如果消费处理时间比较长,最后会因为redis实例连接过期而报错,而think-queue的redis驱动并没有掉线重连处理,这时候我们就需要改一下think-queue源代码了,例如我给消费处理添加了一个公用属性,reconnect,用于在每次处理消费时间比较长的任务调用redis实例时是否重新创建redis连接实例,当然也可以自己写掉线重连代码,不过消费任务时间比较长还是建议重新创建redis连接实例,毕竟维护redis连接很麻烦和耗资源,下面是我的消费处理代码

<?php


namespace app\spider\job;


use app\spider\library\Common;
use think\queue\Job;

class ExcelJob
{
    public $reconnect=true;//是否重连,true=重新连接,false=不重连
    /*
      *用户导出处理
      * */
    public function excelTask(Job $job, $data){
        if ($job->attempts() > 3) {
            $job->delete();
            return;
        }
        $dataArr=json_decode($data,true);
        $exportObj=new \app\common\library\ExportData();
        $result=$exportObj->handleExportTask($dataArr);
        if($result['code'] == 'success'){
            $job->delete();
        }else{
            $job->release(1);
        }
        unset($exportObj);
    }
}

 我在消费处理类添加了个reconnect公用属性,用于判断这个消费处理是不是超耗时的任务,如果是耗时的任务我每次操作redis实例时重新创建一个连接实例,其中think-queue源代码也需要改一下,需要改三个文件

  1.  vendor\topthink\think-queue\src\queue\Job.php 文件
  2. vendor\topthink\think-queue\src\queue\job\Redis.php 文件
  3. vendor\topthink\think-queue\src\queue\connector\Redis.php 文件

先看第一个文件vendor\topthink\think-queue\src\queue\Job.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2015 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值