PHP命令行清理logs目录旧日志需借助外部命令或自定义脚本:Linux/macOS常用find logs/ -name "*.log" -mtime +7 -delete;跨平台推荐PHP脚本,按文件名匹配、按修改时间排序、保留指定数量并安全删除。

php命令行怎么清理logs目录下的旧日志
PHP本身不提供内置的日志清理命令,所谓“logs_phpcli”并不是PHP标准命令或函数,而是你项目中可能自定义的脚本名或目录名。清理动作必须靠外部命令(如find、rm)或PHP脚本主动执行。
用find + rm删除7天前的PHP CLI日志文件
这是最常用、最轻量的做法,适合Linux/macOS。假设你的CLI日志统一存放在logs/目录下,且文件名含.log后缀:
find logs/ -name "*.log" -mtime +7 -delete
说明与注意点:
-
-mtime +7表示“修改时间超过7天”,不是“创建时间”——PHP写日志通常用追加模式,mtime更可靠 - 先测试再删除:把
-delete换成-ls,确认列出的是目标文件 - 如果日志是按日期命名(如
app_20240501.log),find按时间删可能不准,此时更适合用PHP脚本按文件名解析日期 - Windows PowerShell用户需改用
Get-ChildItem+Where-Object,不能直接套用find
用PHP脚本安全清理logs目录(跨平台兼容)
当需要精确控制(比如只删cli_*.log、保留最近10个、记录清理日志),写一个cleanup_logs.php更稳妥:
立即学习“PHP免费学习笔记(深入)”;
$files = array_filter(scandir($logDir), function($f) use ($logDir, $pattern) {
return is_file($logDir . $f) && preg_match($pattern, $f);
});
usort($files, function($a, $b) use ($logDir) {
return filemtime($logDir . $b) - filemtime($logDir . $a); // 新→旧
});$toDelete = array_slice($files, $maxFilesToKeep);
foreach ($toDelete as $file) {
unlink($logDir . $file);
echo "Deleted: $file\n";
}
?>
执行方式:php cleanup_logs.php。关键点:
- 用
filemtime()而非filectime(),因为Windows的ctime是“元数据变更时间”,不可靠 - 正则
$pattern可快速过滤CLI专属日志,避免误删web_access.log等 - 没加
try/catch?实际部署时建议包一层,防止unlink()权限失败导致脚本中断
为什么不要用php -r "unlink(...)"一行命令硬删
有人会写:php -r "array_map('unlink', glob('logs/cli_*.log'));"——看似简洁,但隐患多:
- 不检查文件是否存在,
glob()为空时array_map仍执行,无报错但无提示 - 不校验是否为真实文件(
glob可能匹配到目录),unlink()对目录会报Warning: unlink(): Is a directory - 无法按时间/数量做智能裁剪,容易一次性清空所有日志
- 错误信息全被吞掉,CI/CD里失败也不易察觉
真正稳定的日志清理,得兼顾可读性、容错性和可审计性。哪怕多写几行PHP,也比拼凑shell命令强。











