根本原因是Linux挂载只读或Web服务器用户无写权限;需先用mount和ps aux确认挂载状态及进程用户,再检查目录权限、open_basedir、SELinux等。

PHP写文件报错“Read-only file system”
根本原因不是PHP配置问题,而是Web服务器进程(如www-data、apache、nginx)对目标目录没有写权限,或整个挂载分区被设为只读。直接改php.ini或chmod 777目录往往无效,甚至引入安全风险。
检查Linux挂载状态是否真只读
先确认是不是系统级只读——比如磁盘错误后自动remount为ro,或容器/云主机挂载时加了ro选项:
- 运行
mount | grep "$(df . | tail -1 | awk '{print $1}'),看输出里是否含ro,(注意逗号) - 若看到
ro,relatime这类,说明挂载就是只读的,chmod和chown全部无效 - 修复需用
mount -o remount,rw /mount/point(需root),但容器环境通常不可行,得改启动配置或联系运维
确认Web服务器用户能否写入目标路径
即使挂载是rw,也要确保运行PHP的用户(如www-data)对目录有写权限:
- 用
ps aux | grep apache或ps aux | grep nginx确认worker进程的USER字段 - 执行
ls -ld /path/to/your/upload/dir,检查组/所有者是否匹配,权限位是否含w - 推荐做法:
sudo chown :www-data /path/to/dir && sudo chmod g+w /path/to/dir(不开放world-writable) - 避免
chmod 777:Nginx/Apache默认不以root跑,777也不起作用;且会触发PHP的open_basedir或安全模块拦截
PHP脚本内调用fopen()或file_put_contents()仍失败
常见干扰项:
立即学习“PHP免费学习笔记(深入)”;
-
open_basedir限制:检查phpinfo()输出中该项值,确保目标路径在其白名单内 - SELinux(CentOS/RHEL):即使权限全开,也可能被阻止,临时验证可运行
setenforce 0,若恢复写入则需加SELinux策略 - tmpfs或overlayfs场景(Docker):挂载时漏掉
rw,或用了tmpfs但没设size=导致空间耗尽,表现为“Read-only file system”而非“no space left” - 父目录无执行(x)权限:Linux要求对路径中每个目录都有
x权限才能进入,/var/www/app/cache若/var/www/app无x,也会报只读
mount和ps aux。











