[['egt', $start], ['lt',$end], 'and']]; $item = Model()->table(self::pdlog_table_name)->field('min(lg_id) as minid,max(lg_id) as maxid') ->where($cond)->find(); if(empty($item)) { return [false,0,0]; } else { return [true,intval($item['minid']),intval($item['maxid'])]; } }; [$succ,$minid,$maxid] = $lgid_getter($start_date,$end_date); if($succ) { $this->delete_log($minid,$maxid); } return true; } private function delete_log($minid,$maxid) { //////////////////////////////////////////////////////////////////////////////////////////////////////////////// $mod_refill = Model('refill_order'); $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) { $sdate = date('Y-m-d H:i:s', $log['lg_add_time']); Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}", Log::DEBUG); $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, $order_sn]; } if (empty($order_sn) && strlen($order_sn) < 20) { return [2, false, false]; } if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) { return [2, false, false]; } return [3, $logid, $order_sn]; }; $batch_checker = function ($logs) use ($mod_refill,$batch_check_log) { $del_ids = []; $savers = []; $exist_logs = []; $sns = []; foreach ($logs as $log) { [$type,$logid,$order_sn] = $batch_check_log($log); if($type === 1) { $del_ids[] = $logid; } elseif($type === 3) { $exist_logs[$logid] = $log; $sns[] = $order_sn; } else { } } if(!empty($sns)) { $sns = array_unique($sns); $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select(); $sn_sns = []; foreach ($orders as $item) { $sn = $item['order_sn']; $sn_sns[$sn] = $sn; } foreach ($exist_logs as $logid => $log) { $sn = $log['lg_order_sn']; if(!array_key_exists($sn,$sn_sns)) { $del_ids[] = $logid; $savers[] = $log; } } } return [$del_ids,$savers]; }; $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, $fLog) use($batch_finder,$batch_checker,$batch_delter) { $batch_logs = $batch_finder($minid,$maxid); foreach ($batch_logs as $logs) { [$logids,$savers] = $batch_checker($logs); $batch_delter($logids); foreach ($savers as $item) { fputcsv($fLog,$item); } } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// $cur_time = time(); $sdate = date('Y-m-d',time()); $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv"; $fLog = fopen($filename,'w+'); if (!$fLog) { return false; } else { $batch_handler($minid, $maxid, $fLog); fclose($fLog); return true; } } }