清缓存触发日志警告是因为php think clear默认删除整个runtime/目录,包括当日日志文件,导致log::write()向已删除文件写入失败;需用--except=log或手动清理cache/子目录,并重启web服务恢复日志。

ThinkPHP6执行清缓存操作后,日志里突然出现大量Warning: unlink(): No such file or directory或Warning: file_put_contents(): failed to open stream: No such file or directory类警告,说明清理过程误删了日志系统正在写入的当日日志文件,导致后续日志写入失败并反复报错。
为什么清缓存会连带触发日志警告
php think clear 默认清空整个 runtime/ 目录,包括 runtime/log/ 和 runtime/cache/;但日志通道(如 file 驱动)在运行时持续向当天日志文件(如 think-2026-07-30.log)写入,该文件被 delete 后,Log::write() 仍尝试往已不存在的句柄写入,于是每条日志都触发一次 unlink 或 fopen 失败警告。
这一步不是缓存问题,而是路径冲突——日志和缓存共用 runtime/ 根目录,而 clear 命令不区分子目录用途。
确认是否真删了当日日志文件
进入项目根目录,执行:
ls -l runtime/log/think-$(date +%Y-%m-%d).log
若提示 No such file or directory,说明当日日志文件已被 php think clear 删除;此时日志系统失去落盘目标,所有 Log::info()、Log::error() 调用都会 fallback 到 warning 级错误输出,形成恶性循环。
【关键前提】 日志通道必须配置为 daily 分割(默认行为),否则不会生成日期命名的文件,此现象也不会发生。
安全清理缓存的两种方法
方法一:跳过 log 目录,只清 cache
执行命令:rm -rf runtime/cache/*(Linux/macOS)或 del /q runtime\cache\*(Windows CMD)
方法二:用 --except 参数限定范围
运行:php think clear --except=log
TP6.0+ 支持该参数,它会跳过 runtime/log/,仅清理 cache/、temp/、route/、view/ 等其他子目录。
注意:不要用 php think clear --all,它仍会清 log/,且不提供排除选项。
修复已中断的日志写入
第一步:确保 runtime/log/ 目录存在且权限正确
chmod 755 runtime/log/(Linux/macOS)或右键属性→安全→IIS_IUSRS 全控制(Windows IIS)
第二步:重启 PHP-FPM 或 Apache/Nginx 进程
宝塔面板中点击「重启」对应 PHP 版本服务,让日志驱动重新初始化文件句柄;不重启,旧的损坏句柄仍被复用。
第三步:验证日志是否恢复
手动触发一条日志:php think run 启动内置服务器 → 访问 http://127.0.0.1:8000 → 查看 runtime/log/think-2026-07-30.log 是否新增内容。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











