问答

redis 队列四万条数据,while循环跑阿里接口,512M内存溢出

作者:admin 2021-08-20 我要评论

// 这是定时任务入口public function start(){ $redis = Cache::handler(); // ... 这里省略了写入队列的过程,监控的时候发现这个过程都是正常的。 //就是在 se...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
// 这是定时任务入口
public function start(){
    $redis = Cache::handler();
    // ... 这里省略了写入队列的过程,监控的时候发现这个过程都是正常的。
    //就是在 sendPush 大概2万条数据左右就溢出了!!!
    $this->sendPush($redis,'ali_redis_key')
}
//$redis 是
protected function sendPush($redis,$redis_key){
    $c0 = 0;  // 请求成功计数器
    $c1 = [];  // 请求失败
    $c2 = 0;  // 队列数据无效计数器
    $c3 = 0;  // form_id 不存在计数器
    // 这里是设置支付宝接口参数的,用的是最新的alipay easy
    Factory::setOptions($this->getCertAccount());
    $msgClient = Factory::marketing()->templateMessage();
    $cache_name = 'qcj.alifrom:fromid_';
    while(!empty($va = $redis->lPop($redis_key))) {
        $sendData = explode(',',$va);
        if(count($sendData) === 3){
            $from_id = Cache::get($cache_name.$sendData[2]);
            if( $from_id ) {
                $res = $this->marketingTemplateMessage($msgClient, $sendData[0] , $from_id ,'每日签到' ,'您今天可以签到获取幸运星了哦' , '您已连续签到'.$sendData[1].'天');
                if( $res['code'] == 0 ) {
                    $c0++;
                }else{
                    // 推送异常,删除此 form_id
                    Cache::rm($cache_name.$sendData[2]);
                    $c1[] = $sendData[2];
                }
            }else{
                $c3++;
            }
        }else{
            $c2++;
        }
    }
    Log::warning("执行完毕 , 成功 : $c0 , 失败 : " . join(',',$c1) . "   队列跳过 : $c2 , form_id无效 : $c3");
}
###

c1 一直存在,没有释放, 可以看看一下c1

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 使用箭头函数return数据不能实现

    使用箭头函数return数据不能实现

  • 个人小程序号能接入小程序3D地图吗?

    个人小程序号能接入小程序3D地图吗?

  • vue 移动端项目中,使用了better-scrol

    vue 移动端项目中,使用了better-scrol

  • css如何做出区域平均划分为四列

    css如何做出区域平均划分为四列

腾讯云代理商
海外云服务器