前段时间在用php读取文件的时候突然发生了问题,大体情况是这个样子:

1.服务器刚重做完系统,环境重新搭建

2.fopen函数调用获取文本信息,返回false

3.确定该文本真实存在

这个问题我查了将近一个小时,发现非常奇怪,打印了$_SERVER['DOCUMENT_ROOT'] 项目根目录发现依然和自己写的绝对路径对得上。于是我首先考虑文件路径的权限问题,在把所有层级全都归属为 777 之后发现依然无法访问。然后我又通过file_exists()函数进行验证,发现file_exists()也是返回false,更加奇怪了。最后通过网上查询把问题锁定到了open_basedir上面,下面我来介绍一下open_basedir.

open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件不在指定的目录树之外,程序将拒绝打开。

open_basedir设置方法:

1.在php.ini 加入
pen_basedir=“指定目录”

如果发现配置项前是有分号,表明php.ini中没有该设置。那就很可能是在 php-fpm 中的 fastcgi.conf(一般在nginx/conf)中配置了。php-fpm中的配置会覆盖php.ini的配置。

2.在程序中使用

ini_set('open_basedir', '指定目录');

3.在apache的httpd.conf中的Directory配置

php_admin_value open_basedir "指定目录"

httpd.conf中的VritualHost

php_admin_value open_basedir "指定目录"

4.在nginx 的fastcgi.conf

fastcgi_param PHP_VALUE "open_basedir=指定目录:其他地址:其他地址"

如果要设置多个目录,window使用;分隔目录,Linux使用:分隔目录。

我的open_basedir生效是在nginx的fastcgj.conf里,所以直接把文件权限的目录树放大到该操作文件之上就可以了。