PHP报“File not found”错误的主因是路径解析问题:当前工作目录与预期不符、父目录缺少x权限、写入时父目录不存在,而非文件本身或单纯权限设置问题。
PHP
或
报
但文件明明存在
这不是权限问题,而是 PHP 进程当前工作目录(
)和你预期的路径不一致。比如你在 Web 根目录下执行脚本,但 PHP CLI 模式下默认在
或
启动,
就会找错地方。
实操建议:
用
打印当前路径,确认是否符合预期
避免相对路径,改用绝对路径:用
替代
如果读取的是 Web 可访问资源,优先用
拼接,例如
注意
/
和
对路径解析逻辑一致,但错误提示可能不同——前者报
,后者更常显示
Linux 下 PHP 无法读取文件,
改了还是报错
常见误区:只改了文件权限,却忽略了父目录的
(执行)权限。Linux 中,要进入一个目录并读取其下的文件,该目录必须对运行 PHP 的用户(如
或
)有
权限。
检查与修复步骤:
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
运行
,看目录权限末三位是否含
(如
可,
不可)
补全目录执行权限:
(或更精确地:
)
确认 PHP 进程用户能访问整条路径:用
测试
SELinux 启用时(如 CentOS),
无效,需用
写入失败,错误提示却是
这个错误往往发生在目标路径的**父目录不存在**,而非文件本身。例如写入
,但
目录还没创建。
安全写入建议:
写入前先确保目录存在:
不要依赖
自动建文件——它不会自动建目录
注意
的第三个参数
表示递归创建,否则只建最后一级
如果路径含变量(如
),务必对变量做白名单校验,防止路径遍历
Apache/Nginx + PHP-FPM 环境下路径行为不一致
CLI 模式、Apache mod_
php
、PHP-FPM 的工作目录和用户身份完全不同,同一段代码在不同环境可能一个成功、一个报
。
关键差异点:
Apache mod_php:通常以 Apache 用户(如
)运行,
是 Apache 配置的
PHP-FPM:worker 进程由
中的
/
定义,
默认是 FPM 启动路径(常为
或
)
Nginx + PHP-FPM 组合中,Nginx 不控制 PHP 工作目录,
是 Nginx 传入的,但
仍由 PHP-FPM 进程决定
最稳妥方式:所有路径都基于
或
构造,避开对
的依赖
路径问题从来不是“改个权限就完事”,真正卡住人的,往往是目录的
权限缺失、FPM 和 CLI 的工作目录错位、或者
前忘了
——这些细节不打日志根本看不出。
fopenfile_get_contentsFile not foundgetcwd()/root/home/user./config.phpecho getcwd();__DIR__ . '/config.php''./config.php'$_SERVER['DOCUMENT_ROOT']$_SERVER['DOCUMENT_ROOT'] . '/data/cache.json'includerequirefopenfailed to open stream: No such fileFile not foundchmodxwww-datanginxxls -ld /var/www/html/dataxdrwxr-xr-xdrw-r--r--chmod +x /var/www/html/datachmod 755 /var/www/html/datasudo -u www-data ls -l /var/www/html/data/config.jsonchmodchcon -t httpd_sys_rw_content_t /path/to/filefile_put_contentsFile not found/var/log/app/debug.log/var/log/app/if (!is_dir(dirname($path))) { mkdir(dirname($path), 0755, true); }file_put_contents($path, $data, FILE_APPEND | LOCK_EX)mkdirtrue$year = date('Y'); $path = "/log/$year/app.log";File not foundwww-datagetcwd()DocumentRootwww.confusergroupgetcwd()//var/wwwSCRIPT_FILENAMEgetcwd()__DIR__dirname(__FILE__)getcwd()xfile_put_contentsmkdir