缓存目录权限设置的关键不是盲目给777,而是确保web服务器用户(如www-data)对application/cache有写入和执行权限,路径合法且存在,mkdir()权限参数必须用八进制整数(如0775),并配合框架配置与selinux等安全机制校验。

缓存目录权限设置的关键不是盲目给777,而是让Web服务器进程(如Apache的www-data、Nginx的nginx或php-fpm用户)有写入和执行权限,同时确保路径合法、目录存在、且PHP能正常调用mkdir()创建子目录。
确认缓存目录位置与可写性
CodeIgniter默认将缓存文件写入application/cache/目录。你必须手动确保该目录存在,并赋予Web服务器用户写权限:
- 先检查目录是否存在:若不存在,需在部署时创建(不能依赖运行时自动创建,尤其在某些安全加固环境里)
- 使用绝对路径确认真实路径,避免因符号链接或chroot导致路径解析错误
- 执行
ls -ld application/cache查看当前权限和属主,确认属主是Web服务器运行用户(如www-data),而非root或开发用户
正确设置权限数值(不是字符串)
PHP中用mkdir()创建缓存子目录时,权限参数必须是八进制整数,不是字符串:
- ✅ 正确:
mkdir($path, 0775)或chmod($path, 0775) - ❌ 错误:
mkdir($path, '775')—— 字符串会被转为十进制0,实际等效于mkdir($path, 0),权限极低,几乎无法写入 - 推荐用
0775(属主/组可读写执行,其他只读执行),比0777更安全;若环境严格限制组权限,可用0755并确保Web用户是目录属主
验证Web服务器用户能否真正写入
权限数字只是基础,最终取决于谁在运行PHP进程:
- 在Linux上,用
ps aux | grep apache或ps aux | grep nginx确认主进程用户,再用sudo -u www-data touch application/cache/test.txt测试是否可写 - 如果用PHP-FPM,检查
www.conf中的user和group配置,并确保application/cache/属主匹配 - SELinux或AppArmor启用时,即使权限正确也可能被拦截,可用
ausearch -m avc -ts recent查拒绝日志
配合框架配置做双重保障
除了系统级权限,CodeIgniter自身也需配合:
- 确保
application/config/config.php中$config['cachedir']指向正确路径(CI3);CI4中缓存路径由app/Config/Cache.php控制 - 首次访问触发缓存时,留意PHP错误日志——常见报错如“failed to open stream: Permission denied”直接指向权限问题
- 缓存文件生成后,检查其属主是否与Web进程一致;若属主是
root,说明是命令行手动创建的,需用chown -R www-data:www-data application/cache修正











