ci项目上线后常见“权限不足”假象实为sess_save_path配置错误:必须设为fcpath拼接的绝对路径(如fcpath.'writable/sessions'),父目录需预先存在;mkdir权限须用八进制字面量0777或先mkdir再chmod;目录缺x权限将导致写入失败;ci4中writepath失效多因web根目录未正确定向public/子目录且.env未置于项目根。

sess_save_path 配置为空或相对路径导致 mkdir(): Invalid path
这是 CI 项目上线后最常触发的“权限不足”假象——实际根本没走到权限检查那步,PHP 直接在 Session_files_driver.php 里因路径非法而报错。错误信息明确写着 mkdir(): Invalid path,但很多人第一反应是 chmod 777,完全跑偏。
关键点有三个:
-
$config['sess_save_path']绝对不能为NULL、空字符串或相对路径(如'sessions') - 必须用
FCPATH拼出绝对路径,例如:$config['sess_save_path'] = FCPATH . 'writable/sessions'; - 该路径的父目录(这里是
writable/)必须已存在,否则mkdir()连创建机会都没有
验证方式:在控制器里加一行 var_dump($config['sess_save_path']); exit;,确认输出的是完整绝对路径,且开头不是 ./ 或 ../。
chmod 0777 不生效?八进制权限被当字符串解析了
手写 mkdir($path, '0777') 或 mkdir($path, '777'),新建目录权限大概率是 0755,不是你想要的 0777。原因很简单:PHP 把字符串 '777' 当作十进制数处理,777 的八进制表示是 01411,而 mkdir() 只取低三位,结果就是 0755。
正确做法只有两种:
- 写成八进制字面量:
mkdir($path, 0777)(注意前面的0) - 更稳妥:先
mkdir($path, 0755),再单独chmod($path, 0777),避开umask干扰
生产环境别硬上 0777;优先改属主:chown -R www-data:www-data $path,然后设为 0750 或 0755。
目录可创建但无法写入:缺执行(x)权限
Linux 下,对目录没有 x 权限,就等于禁止进入——哪怕 is_dir() 返回 true,后续 fopen()、move_uploaded_file() 全都会失败,报错类似 A problem was encountered while attempting to move the uploaded file。
检查方法很简单:
- 运行
ls -ld /path/to/dir - 看输出第三段(组权限)和最后一段(其他权限)里是否有
x,例如drwxr-xr-x是 OK 的,drw-r--r--就不行
补权限只需一句:chmod +x /path/to/dir。不需要重设整个权限,只加执行位最安全。
CI4 的 WRITEPATH 目录权限失效:public 不是根目录惹的祸
很多人在 cPanel 或虚拟主机上直接把 CI4 整个项目丢进 public_html,然后访问 public_html/myapp/public/index.php —— 这会导致 WRITEPATH(默认指向 ../writable/)解析成错误路径,日志、缓存、session 全部写不进去,但错误还不明显。
根本解法只有一个:Web 根目录必须指向 public/ 子目录。
- 虚拟主机控制面板里,把域名根目录设为项目内
public/路径(不是项目根) - 若只能上传到
public_html,则把public/内所有文件(含.htaccess和index.php)移到public_html/,再手动修正index.php中的require __DIR__ . '/../vendor/autoload.php';等路径 - 千万别漏掉
.env文件——它必须放在项目根(与app/同级),否则WRITEPATH常量压根不会被正确初始化
大小写敏感、路径层级、.env 位置,三者只要错一个,WRITEPATH 就会静默失效,排查时最容易反复绕弯。










