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

// 这是定时任务入口
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");
}
阅读 2.3k
1 个回答
新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题