You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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测试:
    sudo setenforce 0
    
    如果报错消失,就需要永久调整SELinux策略:
    sudo 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:27:45