基于 yiisoft/yii2-app-advanced,在 GitHub 上新建仓库 yii2-app-advanced,日志消息的自动定时删除 (十一)
1、由于日志消息是存储于 MySQL 的 log 表中,在生产环境中,累积了大量的数据,log 表的数据长度已经达到 数百 GB ,因此,决定基于控制台命令行实现日志消息的定时删除,开发环境的 log 表的数据长度为 14.64 GB,如图1
2、编辑 \console\controllers\LogController.php,获取服务器当前时间,判断范围([0点,1点)),如果不在范围内,则延缓执行 10 * 60 秒,再退出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2019/10/08 * Time: 13:36 */ namespace console\controllers; use Yii; use console\models\Log; use yii\console\Controller; use yii\console\ExitCode; use yii\helpers\ArrayHelper; use yii\web\HttpException; use yii\web\ServerErrorHttpException; /** * 日志 * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class LogController extends Controller { const SLEEP_TIME = 10 * 60; // 延缓执行 10 * 60 秒 /** * 日志的删除 * */ public function actionDelete() { /* 获取服务器当前时间,判断范围([0点,1点)),如果不在范围内,则延缓执行 10 * 60 秒,再退出 */ $time = time(); $zeroTime = strtotime ( "today" ); // 0点 $oneTime = strtotime ( "today +1 hours" ); // 1点 echo $time . " " ; echo date ( 'Y-m-d H:i:s' , $time ) . " " ; echo $zeroTime . " " ; echo date ( 'Y-m-d H:i:s' , $zeroTime ) . " " ; echo $oneTime . " " ; echo date ( 'Y-m-d H:i:s' , $oneTime ) . " " ; exit ; if (!( $time >= $zeroTime && $time < $oneTime )) { // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } echo 1; exit ; } } |
1 2 | PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1570518464 2019-10-08 15:29:17 1570464000 2019-10-08 00:00:00 1570467600 2019-10-08 01:00:00 |
3、查询 1 条记录的日志时间($logTime),基于 日志时间 升序排列,如果不存在,则延缓执行 10 * 60 秒,再退出
1 2 3 4 5 6 7 8 9 | /* 查询 1 条记录的日志时间($logTime),基于 日志时间 升序排列,如果不存在,则延缓执行 10 * 60 秒,再退出 */ $logItem = Log::find()->select([ 'log_time' ])->orderBy([ 'log_time' => SORT_ASC])->limit(1)->one(); if (!isset( $logItem )) { // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } $logTime = $logItem ->log_time; |
4、获取服务器当前时间的前 15 天(默认值,可自定义)的值($reservedTime:保留时间,0点),如果 $logTime 大于等于 $reservedTime,则延缓执行 10 * 60 秒,再退出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* 获取服务器当前时间的前 15 天(默认值,可自定义)的值($reservedTime:保留时间,0点),如果 $logTime 大于等于 $reservedTime,则延缓执行 10 * 60 秒,再退出 */ $reservedTime = strtotime ( "today -15 days" ); // 保留时间,0点 echo $logTime . " " ; echo date ( 'Y-m-d H:i:s' , $logTime ) . " " ; echo $reservedTime . " " ; echo date ( 'Y-m-d H:i:s' , $reservedTime ) . " " ; if ( $logTime >= $reservedTime ) { echo 0; exit ; // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } echo 1; exit ; |
1 2 | PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1567046168.2703 2019-08-29 10:36:08 1569168000 2019-09-23 00:00:00 1 |
5、获取 1 条记录的日志时间($logTime)的后 1 天的值($deadlineTime:截止时间,0点),如果 $deadlineTime 大于 $reservedTime,则将 $reservedTime 赋值给 $deadlineTime(后 1 天的值时,此条件永远不满足,大于 1 天时,此条件可能满足)
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* 获取 1 条记录的日志时间($logTime)的后 1 天的值($deadlineTime:截止时间,0点),如果 $deadlineTime 大于 $reservedTime,则将 $reservedTime 赋值给 $deadlineTime(后 1 天的值时,此条件永远不满足,大于 1 天时,此条件可能满足) */ $logDate = date ( 'Y-m-d' , $logTime ); $deadlineTime = strtotime ( "$logDate +1 days" ); // 截止时间,0点 echo $logDate . " " ; echo date ( 'Y-m-d H:i:s' , $deadlineTime ) . " " ; if ( $deadlineTime > $reservedTime ) { $deadlineTime = $reservedTime ; echo 1; exit ; } echo date ( 'Y-m-d H:i:s' , $deadlineTime ) . " " ; echo 2; exit ; |
1 2 | PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 2019-08-29 2019-08-30 00:00:00 2019-08-30 00:00:00 2 |
6、执行删除 SQL(),条件(日志时间 小于 $deadlineTime),即命令行 1 次运行仅删除 1 天的日志消息,延缓执行 60 秒,再退出。
注:执行删除 SQL(),DELETE FROM `cpa_log` WHERE `log_time` < 1570590733,删除 26 万余条记录(1 天的日志消息),发现执行时间长达 1 分余钟,如图2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2019/10/08 * Time: 13:36 */ namespace console\controllers; use Yii; use console\models\Log; use yii\console\Controller; use yii\console\ExitCode; use yii\helpers\ArrayHelper; use yii\web\HttpException; use yii\web\ServerErrorHttpException; /** * 日志 * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class LogController extends Controller { const SLEEP_TIME = 10 * 60; // 延缓执行 10 * 60 秒 /** * 日志的删除 * */ public function actionDelete() { /* 获取服务器当前时间,判断范围([0点,1点]),如果不在范围内,则延缓执行 10 * 60 秒,再退出 */ $time = time(); // 当前时间 $zeroTime = strtotime ( "today" ); // 0点 $oneTime = strtotime ( "today +1 hours" ); // 1点 if (( $time >= $zeroTime && $time <= $oneTime )) { // 延缓执行 10 * 60 秒 echo 0; exit ; sleep( static ::SLEEP_TIME); return ExitCode::OK; } /* 查询 1 条记录的日志时间($logTime),基于 日志时间 升序排列,如果不存在,则延缓执行 10 * 60 秒,再退出 */ $logItem = Log::find()->select([ 'log_time' ])->orderBy([ 'log_time' => SORT_ASC])->limit(1)->one(); if (!isset( $logItem )) { // 延缓执行 10 * 60 秒 echo 1; exit ; sleep( static ::SLEEP_TIME); return ExitCode::OK; } $logTime = $logItem ->log_time; /* 获取服务器当前时间的前 15 天(默认值,可自定义)的值($reservedTime:保留时间,0点),如果 $logTime 大于等于 $reservedTime,则延缓执行 10 * 60 秒,再退出 */ $reservedTime = strtotime ( "today -15 days" ); // 保留时间,0点 echo $logTime . " " ; echo date ( 'Y-m-d H:i:s' , $logTime ) . " " ; echo $reservedTime . " " ; echo date ( 'Y-m-d H:i:s' , $reservedTime ) . " " ; if ( $logTime >= $reservedTime ) { echo 2; exit ; // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } /* 获取 1 条记录的日志时间($logTime)的后 1 天的值($deadlineTime:截止时间,0点),如果 $deadlineTime 大于 $reservedTime,则将 $reservedTime 赋值给 $deadlineTime(后 1 天的值时,此条件永远不满足,大于 1 天时,此条件可能满足) */ $logDate = date ( 'Y-m-d' , $logTime ); $deadlineTime = strtotime ( "$logDate +1 days" ); // 截止时间,0点 echo $logDate . " " ; echo date ( 'Y-m-d H:i:s' , $deadlineTime ) . " " ; if ( $deadlineTime > $reservedTime ) { $deadlineTime = $reservedTime ; } echo date ( 'Y-m-d H:i:s' , $deadlineTime ) . " " ; /* 执行删除 SQL(),条件(日志时间 小于 $deadlineTime),即命令行 1 次运行仅删除 1 天的日志消息,延缓执行 60 秒,再退出 */ Log::deleteAll([ '<' , 'log_time' , $deadlineTime ]); // 延缓执行 60 秒 //sleep(60); //return ExitCode::OK; echo 3; exit ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1567046168.2703 2019-08-29 10:36:08 1569168000 2019-09-23 00:00:00 2019-08-29 2019-08-30 00:00:00 2019-08-30 00:00:00 3 PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1567094579.432 2019-08-30 00:02:59 1569168000 2019-09-23 00:00:00 2019-08-30 2019-08-31 00:00:00 2019-08-31 00:00:00 3 PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1567180800.2962 2019-08-31 00:00:00 1569168000 2019-09-23 00:00:00 2019-08-31 2019-09-01 00:00:00 2019-09-01 00:00:00 3 PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1567267282.2226 2019-09-01 00:01:22 1569168000 2019-09-23 00:00:00 2019-09-01 2019-09-02 00:00:00 2019-09-02 00:00:00 3 PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1568958887.1824 2019-09-20 13:54:47 1569168000 2019-09-23 00:00:00 2019-09-20 2019-09-21 00:00:00 2019-09-21 00:00:00 PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1569832928.1543 2019-09-30 16:42:08 1569168000 2019-09-23 00:00:00 2 PS E:\wwwroot\github-shuijingwan-yii2-app-advanced> ./yii log/delete 1569832928.1543 2019-09-30 16:42:08 1569168000 2019-09-23 00:00:00 2 |
7、设置参数,日志的定时删除的保留时间(前 15 天),单位为天,编辑 \console\config\params-local.php
1 2 3 4 | <?php return [ 'logDeleteReservedTime' => 15, // 日志的定时删除的保留时间(前 15 天),单位为天 ]; |
8、最终的代码实现,开发环境的 log 表的数据长度为 2.36 GB,符合预期,如图3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2019/10/08 * Time: 13:36 */ namespace console\controllers; use Yii; use console\models\Log; use yii\console\Controller; use yii\console\ExitCode; /** * 日志 * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class LogController extends Controller { const SLEEP_TIME = 10 * 60; // 延缓执行 10 * 60 秒 /** * 日志的删除 */ public function actionDelete() { /* 获取服务器当前时间,判断范围([0点,1点]),如果不在范围内,则延缓执行 10 * 60 秒,再退出 */ $time = time(); // 当前时间 $zeroTime = strtotime ( "today" ); // 0点 $oneTime = strtotime ( "today +1 hours" ); // 1点 if (!( $time >= $zeroTime && $time < $oneTime )) { // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } /* 查询 1 条记录的日志时间($logTime),基于 日志时间 升序排列,如果不存在,则延缓执行 10 * 60 秒,再退出 */ $logItem = Log::find()->select([ 'log_time' ])->orderBy([ 'log_time' => SORT_ASC])->limit(1)->one(); if (!isset( $logItem )) { // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } $logTime = $logItem ->log_time; /* 获取服务器当前时间的前 15 天(默认值,可自定义)的值($reservedTime:保留时间,0点),如果 $logTime 大于等于 $reservedTime,则延缓执行 10 * 60 秒,再退出 */ $logDeleteReservedTime = Yii:: $app ->params[ 'logDeleteReservedTime' ]; $reservedTime = strtotime ( "today -$logDeleteReservedTime days" ); // 保留时间,0点 if ( $logTime >= $reservedTime ) { // 延缓执行 10 * 60 秒 sleep( static ::SLEEP_TIME); return ExitCode::OK; } /* 获取 1 条记录的日志时间($logTime)的后 1 天的值($deadlineTime:截止时间,0点),如果 $deadlineTime 大于 $reservedTime,则将 $reservedTime 赋值给 $deadlineTime(后 1 天的值时,此条件永远不满足,大于 1 天时,此条件可能满足) */ $logDate = date ( 'Y-m-d' , $logTime ); $deadlineTime = strtotime ( "$logDate +1 days" ); // 截止时间,0点 if ( $deadlineTime > $reservedTime ) { $deadlineTime = $reservedTime ; } /* 执行删除 SQL(),条件(日志时间 小于 $deadlineTime),即命令行 1 次运行仅删除 1 天的日志消息,延缓执行 60 秒,再退出 */ Log::deleteAll([ '<' , 'log_time' , $deadlineTime ]); // 延缓执行 60 秒 sleep(60); return ExitCode::OK; } } |
近期评论