table(self::pdlog_table_name)->field('min(lg_id) as minid,max(lg_id) as maxid')->find(); if(empty($item)) { return [false,0,0]; } else { return [true,intval($item['minid']),intval($item['maxid'])]; } }; [$succ,$minid,$maxid] = $lgid_getter(); if($latest > $minid) { $minid = $latest; } if($succ) { $this->delete_log($minid,$maxid); } return true; } private function delete_log($minid,$maxid) { $pd_log = Model(); /// 一批一批的删除日志 $batch_finder = function ($start, $end) { if($start > $end) return; $quit = false; while (!$quit) { $flag = $start + self::step_length > $end ? $end : $start + self::step_length; $cond = ['lg_id' => [['egt', $start], ['elt',$flag], 'and']]; $items = Model()->table(self::pdlog_table_name) ->field('*') ->where($cond) ->order('lg_id asc')->select(); if(!empty($items)) { yield $items; } if($flag >= $end) { break; } else { $start = $flag; } } }; //return:1,可以直接删除,不需要存储; 2,不可以删除,3,检查后可以删除 $batch_check_log = function ($log) { $logid = intval($log['lg_id']); $order_sn = $log['lg_order_sn']; $lgtype = $log['lg_type']; if (in_array($lgtype, ['bonus_add_money', 'hand_out_bonus', 'bonus_refund', 'bonus_expire'])) { return [1, $logid]; } if (empty($order_sn) && strlen($order_sn) < 20) { return [2, false]; } if (in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) { return [1, $logid]; } return [2, $logid]; }; $batch_checker = function ($logs) use ($batch_check_log) { $del_ids = []; foreach ($logs as $log) { [$type,$logid] = $batch_check_log($log); if($type === 1) { $del_ids[] = $logid; } } return $del_ids; }; $batch_delter = function ($logids) use ($pd_log) { if (!empty($logids)) { $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => ['in',$logids]])->delete(); return $result; } else { return false; } }; $batch_handler = function ($minid, $maxid) use($batch_finder,$batch_checker,$batch_delter) { $index = 0; $count = 0; $batch_logs = $batch_finder($minid,$maxid); foreach ($batch_logs as $logs) { $logids = $batch_checker($logs); if(!empty($logids)) { $batch_delter($logids); $count += count($logids); Log::record("del pd_log lines={$count}",Log::DEBUG); // $index += 1; // if($index % 1000 === 0) { // Log::record("del pd_log index={$index}",Log::DEBUG); // sleep(1); // } } } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// $batch_handler($minid, $maxid); } }