在php命令行环境下清理logs,本质是用php cli执行一段脚本,遍历日志目录并按条件删除文件。这种方式比手动rm更安全,也能灵活控制保留时间。
为什么用php cli清理logs
有些项目日志由php脚本自己生成,用php cli清理可以直接复用项目的配置和路径常量。另外在定时任务里用php命令比shell混合调用更好维护。
基础清理命令示例
下面这段脚本会删除logs目录下修改时间超过7天的所有文件。
<?php
// 日志目录
$logDir = __DIR__ . '/logs';
// 保留天数
$keepDays = 7;
$now = time();
if (!is_dir($logDir)) {
exit("logs目录不存在n");
}
$files = scandir($logDir);
foreach ($files as $f) {
if ($f === '.' || $f === '..') {
continue;
}
$path = $logDir . DIRECTORY_SEPARATOR . $f;
if (is_file($path)) {
// 文件修改时间早于阈值则删除
if ($now - filemtime($path) > $keepDays * 86400) {
unlink($path);
echo "已删除: " . $path . "n";
}
}
}
echo "清理完成n";
?>
把上面代码保存为clean_logs.php,在终端执行:
php clean_logs.php
用通配符只清特定日志
如果只想清理以.log结尾的文件,可以把scandir换成glob。
<?php
$logDir = __DIR__ . '/logs';
$keepDays = 7;
$now = time();
// 只匹配.log文件
foreach (glob($logDir . '/*.log') as $path) {
if (is_file($path)) {
if ($now - filemtime($path) > $keepDays * 86400) {
unlink($path);
echo "已删除: " . $path . "n";
}
}
}
?>
加入命令行参数
为了让清理更灵活,可以用getopt接收目录和天数参数。
<?php
$opts = getopt('d:t:');
$logDir = isset($opts['d']) ? $opts['d'] : __DIR__ . '/logs';
$keepDays = isset($opts['t']) ? (int)$opts['t'] : 7;
$now = time();
foreach (glob($logDir . '/*.log') as $path) {
if (is_file($path)) {
if ($now - filemtime($path) > $keepDays * 86400) {
unlink($path);
}
}
}
echo "清理完成n";
?>
调用方式:
php clean_logs.php -d /var/www/logs -t 30
注意事项
- 执行php cli的用户要有logs目录的读和删权限
- 删除前建议先打印路径确认,避免误删
- 可配合crontab每天自动跑一次
通过上述步骤,你就可以用php命令行稳定地清理logs了。