1、由于日志消息是存储于 MySQL 的 log 表中,在生产环境中,累积了大量的数据,log 表的数据长度已经达到 数百 GB ,因此,决定基于控制台命令行实现日志消息的定时删除,开发环境的 log 表的数据长度为 14.64 GB,如图1
2、编辑 /console/controllers/LogController.php,获取服务器当前时间,判断范围([0点,1点)),如果不在范围内,则延缓执行 10 * 60 秒,再退出
<?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;
}
}
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 条记录的日志时间($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 秒,再退出
/* 获取服务器当前时间的前 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;
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 条记录的日志时间($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;
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
<?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;
}
}
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
<?php
return [
'logDeleteReservedTime' => 15, // 日志的定时删除的保留时间(前 15 天),单位为天
];
8、最终的代码实现,开发环境的 log 表的数据长度为 2.36 GB,符合预期,如图3
<?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;
}
}
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/webdev/181409.html
