PHP Session启动因只读文件系统报错,Chmod无效,如何修复?
解决session_start()只读文件系统错误的方案
遇到这种Read-only file system的报错,死磕chmod肯定没用——因为整个文件系统都被挂载成只读状态了,咱们换几个思路来解决:
1. 先确认并修复文件系统挂载状态
首先得搞清楚目标目录所在的分区是不是真的只读挂载了:
- 执行
mount命令,找到/var/lib/php/sessions所属的分区,看输出里有没有ro(只读)标记 - 如果确实是只读挂载,先临时重新挂载为读写模式:
sudo mount -o remount,rw / # 如果是根分区的话,替换成对应分区路径 - 要是重启后又变回只读,得检查
/etc/fstab配置文件,找到对应分区的行,把ro选项改成rw,然后重启系统生效
2. 更换Session存储目录
既然原目录没法操作,直接给PHP换个有权限的存储目录就行:
- 临时代码层面修改:在调用
session_start()之前添加一行代码,指定新的目录(记得先手动创建这个目录):
然后给这个目录设置正确的权限:// 先提前创建/home/vagrant/code/getvideo/sessions目录 session_save_path('/home/vagrant/code/getvideo/sessions'); session_start();sudo chown www-data:www-data /home/vagrant/code/getvideo/sessions sudo chmod 700 /home/vagrant/code/getvideo/sessions - 永久修改PHP配置:找到
php.ini文件(可以用php --ini找路径),修改session.save_path的值为你有权限的目录,之后重启PHP服务(比如sudo systemctl restart php-fpm或者sudo systemctl restart apache2)
3. 检查安全模块限制
如果是Linux系统,SELinux或者AppArmor可能会限制PHP读写session目录:
- SELinux排查:先临时关闭SELinux测试:
如果报错消失,就需要永久调整SELinux策略:sudo setenforce 0sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/lib/php/sessions(/.*)?" sudo restorecon -Rv /var/lib/php/sessions - AppArmor排查:检查AppArmor对PHP或Apache的配置(比如
/etc/apparmor.d/usr.sbin.apache2),确保里面允许读写/var/lib/php/sessions目录,修改后重启AppArmor服务:sudo systemctl restart apparmor
4. 排查磁盘本身的问题
有时候磁盘满了或者出现硬件故障,系统会自动把分区挂载为只读来保护数据:
- 用
df -h检查磁盘使用率,看看是不是某个分区满了 - 用
dmesg | grep -i error查看系统日志,找磁盘相关的错误信息 - 如果是磁盘满了,清理日志、临时文件等无用数据;如果是硬件问题,需要检查磁盘健康状态(比如用
smartctl工具)
内容的提问来源于stack exchange,提问作者Marine Gasparyan
相关产品推荐
相关产品推荐

