pdlog_clear_refill.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace refill;
  3. use Log;
  4. use trans_wapper;
  5. use Exception;
  6. class pdlog_clear_all
  7. {
  8. const pdlog_table_name = 'pd_log';
  9. const step_length = 1000;
  10. public function clear($latest)
  11. {
  12. $lgid_getter = function ()
  13. {
  14. $item = Model()->table(self::pdlog_table_name)->field('min(lg_id) as minid,max(lg_id) as maxid')->find();
  15. if(empty($item)) {
  16. return [false,0,0];
  17. }
  18. else {
  19. return [true,intval($item['minid']),intval($item['maxid'])];
  20. }
  21. };
  22. [$succ,$minid,$maxid] = $lgid_getter();
  23. if($latest > $minid) {
  24. $minid = $latest;
  25. }
  26. if($succ) {
  27. $this->delete_log($minid,$maxid);
  28. }
  29. return true;
  30. }
  31. private function delete_log($minid,$maxid)
  32. {
  33. $pd_log = Model();
  34. /// 一批一批的删除日志
  35. $batch_finder = function ($start, $end)
  36. {
  37. if($start > $end) return;
  38. $quit = false;
  39. while (!$quit)
  40. {
  41. $flag = $start + self::step_length > $end ? $end : $start + self::step_length;
  42. $cond = ['lg_id' => [['egt', $start], ['elt',$flag], 'and']];
  43. $items = Model()->table(self::pdlog_table_name)
  44. ->field('*')
  45. ->where($cond)
  46. ->order('lg_id asc')->select();
  47. if(!empty($items)) {
  48. yield $items;
  49. }
  50. if($flag >= $end) {
  51. break;
  52. }
  53. else {
  54. $start = $flag;
  55. }
  56. }
  57. };
  58. //return:1,可以直接删除,不需要存储; 2,不可以删除,3,检查后可以删除
  59. $batch_check_log = function ($log)
  60. {
  61. $logid = intval($log['lg_id']);
  62. $order_sn = $log['lg_order_sn'];
  63. $lgtype = $log['lg_type'];
  64. if (in_array($lgtype, ['bonus_add_money', 'hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  65. return [1, $logid];
  66. }
  67. if (empty($order_sn) && strlen($order_sn) < 20) {
  68. return [2, false];
  69. }
  70. if (in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  71. return [1, $logid];
  72. }
  73. return [2, $logid];
  74. };
  75. $batch_checker = function ($logs) use ($batch_check_log)
  76. {
  77. $del_ids = [];
  78. foreach ($logs as $log)
  79. {
  80. [$type,$logid] = $batch_check_log($log);
  81. if($type === 1) {
  82. $del_ids[] = $logid;
  83. }
  84. }
  85. return $del_ids;
  86. };
  87. $batch_delter = function ($logids) use ($pd_log)
  88. {
  89. if (!empty($logids)) {
  90. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => ['in',$logids]])->delete();
  91. return $result;
  92. } else {
  93. return false;
  94. }
  95. };
  96. $batch_handler = function ($minid, $maxid) use($batch_finder,$batch_checker,$batch_delter)
  97. {
  98. $index = 0;
  99. $count = 0;
  100. $batch_logs = $batch_finder($minid,$maxid);
  101. foreach ($batch_logs as $logs)
  102. {
  103. $logids = $batch_checker($logs);
  104. if(!empty($logids)) {
  105. $batch_delter($logids);
  106. $count += count($logids);
  107. Log::record("del pd_log lines={$count}",Log::DEBUG);
  108. // $index += 1;
  109. // if($index % 1000 === 0) {
  110. // Log::record("del pd_log index={$index}",Log::DEBUG);
  111. // sleep(1);
  112. // }
  113. }
  114. }
  115. };
  116. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  117. $batch_handler($minid, $maxid);
  118. }
  119. }