Symfony 6.3生产环境unlink()函数随机报错排查求助
检查容器内Profiler存储目录的异常文件
进入运行的PHP容器,查看var/profiler目录下是否存在带空字节的文件名,执行命令:ls -la var/profiler | grep $'\0',如果有结果直接删除这些文件。同时排查是否有自定义代码或第三方扩展在写入Profiler文件时引入了空字节。验证Docker挂载目录的兼容性
如果生产环境用宿主机目录挂载var/profiler,检查宿主机文件系统类型(比如Windows NTFS、macOS APFS),跨平台文件系统可能处理特殊字符时出问题。可以临时取消挂载,改用容器内存储,观察错误是否消失。另外确认PHP进程对该目录有完整读写权限,权限不足可能导致文件写入不完整,生成带空字节的文件名。强制触发清理逻辑并模拟并发场景
在容器内的项目目录手动执行清理命令,批量触发清理:php bin/console debug:profiler:purge --days=2同时用
ab或循环curl调用接口制造高并发,看是否能复现错误,排查是清理逻辑本身问题还是并发竞态条件导致。临时禁用自动清理验证
修改config/packages/web_profiler.yaml,关闭自动清理:web_profiler: toolbar: true intercept_redirects: false profiler: enabled: true collect: true purge: default: schedule: never部署后观察请求是否还报错,如果不再出现,说明问题出在自动清理逻辑里,可以改用定时任务手动清理替代。
排查PHP环境差异
对比本地和生产环境的PHP扩展列表(执行php -m),重点看文件系统相关扩展(如posix、fileinfo),不同扩展可能影响文件名处理。另外检查生产环境的open_basedir配置,是否限制了文件访问路径导致异常。
内容的提问来源于stack exchange,提问作者arsene stein

