123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- <?php
- namespace refill;
- use Log;
- use trans_wapper;
- use Exception;
- class pdlog_clear_all
- {
- const pdlog_table_name = 'pd_log';
- const step_length = 1000;
- public function clear($latest)
- {
- $lgid_getter = function ()
- {
- $item = Model()->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);
- }
- }
|