应使用php脚本而非shell命令清理日志,因其跨平台、可校验权限、支持dry-run;核心是遍历logs目录,用filemtime()判断并删除超期文件,且须检查is_writable()。

Composer脚本里没法直接删日志,得靠外部命令
Composer 的 scripts 本质是 shell 命令调度器,不带文件清理逻辑。想删日志,必须调用系统命令(如 find、rm)或 PHP 脚本。直接写 rm -f storage/logs/*.log 看似简单,但没加时间判断,会误删当天日志。
- 推荐用
find按修改时间筛选:例如只删 7 天前的.log文件 - 避免硬编码路径,用
$APP_LOG_PATH环境变量或 Composer 的extra配置传入路径 - Windows 下
find不可用,需改用 PowerShell 或兼容脚本 —— 生产环境建议统一用 PHP 实现跨平台
用 PHP 脚本实现跨平台日志清理更可靠
在项目里放一个 bin/clean-logs.php,比 shell 更可控,也方便加日志记录和 dry-run 模式。
- 核心逻辑:遍历
storage/logs/目录,用filemtime()判断是否超过保留天数 - 务必加
is_writable()检查权限,否则 Composer 执行时静默失败 - 示例片段:
foreach (glob($logDir . '/*.log') as $file) { if (is_file($file) && filemtime($file) - 注意 glob 不递归,如果日志按日期分目录(如
storage/logs/2024-05/),得用RecursiveDirectoryIterator
注册为 Composer script 并控制执行时机
把清理逻辑绑定到 Composer 生命周期事件,比如 post-autoload-dump 或自定义命令,别塞进 post-install-cmd —— 部署时不一定需要删日志。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json的scripts里写:"clean-logs": "php bin/clean-logs.php --days=7"
- 支持参数传递:用
symfony/console或简单解析$argv,避免写死天数 - CI/CD 中慎用自动触发:建议只在部署后手动跑
composer run clean-logs,防止并发部署时误删共享日志 - 若用 Laravel,优先走
php artisan log:clear(Laravel 10+ 内置),它已处理了轮转与权限问题
权限和 SELinux 是线上最常卡住的地方
本地测试通过,上线就失败?90% 是 Web 服务器用户(如 www-data)没权限删 CLI 用户(如 deploy)生成的日志文件,或者 SELinux 策略拦住了 unlink。
- 检查日志文件属主:
ls -l storage/logs/,确保运行 Composer 的用户有写权限 - 临时调试加
echo get_current_user();和print_r(posix_getpwuid(posix_geteuid())); - SELinux 下,
setsebool -P httpd_can_network_connect 1不管用,真正要的是httpd_can_script_exec和httpd_read_user_content - 容器环境注意:挂载卷的 uid/gid 是否匹配,
docker run -u 1001可能导致权限错乱
日志清理看着简单,实际卡点全在权限链和路径上下文里——别信“删个文件而已”,先确认谁在删、在哪删、以什么身份删。










