我有几个看起来像这样的文件:
的index.php:
<?php
include('includes/header.php');
...
包括/ header.php文件:
<?php
include('config.php');
...
我得到的错误是
警告:require(config.php)[function.require]:无法打开流:第2行的[dir] /includes/header.php中没有此类文件或目录 致命错误:require()[function.require]:在[dir] / includes / header中打开所需的'config.php'(include_path ='。:/ usr / share / pear:/ usr / share / php')失败。 php在第2行
我做了一些进一步的调试:当我添加呼叫时
system('pwd');
到includes / header.php,它显示[dir],它应该说[dir] / includes。将“includes /”添加到包含路径有效,但不可取,因为在生产服务器上会失败。
以上代码适用于生产服务器,并且在我的开发Fedora服务器上工作正常,直到我尝试更改我的开发环境,以便Fedora服务器的文档根目录是已挂载的CIFS共享。
有什么想法吗?感谢。
答案 0 :(得分:0)
工作正常......直到我尝试更改我的开发环境,以便Fedora服务器的文档根目录是已挂载的CIFS共享。
是否启用了SELinux?
检查/var/log/audit/audit.log
我要打赌SELinux已经启用并处于执行模式,并且正在干扰。
答案 1 :(得分:0)
我讨厌说出来,但你所描述的pwd
行为是100%预期的行为(至少从PHP4开始......可能更早)。
PHP自动设置当前工作目录(由pwd使用)ONCE。 PHP不会改变它。因此,。将引用原始当前工作目录,除非您使用chdir()手动更改它。
使用这个问题有各种解决方案;您可以在PHP include file strategy needed看到大部分内容。
如果之前有效,可能会在某处更新include_path,更改工作目录的代码不再更改它,或者您使用的php版本实现了这种奇怪的(但更期望的)行为不再如此
无论如何,我会检查包含路径:ini文件或更改包含路径的脚本。我猜测用于更新include_path的东西,但不再这样做了。
我不确定你如何移动它的细节但是我遇到了一些讨厌的脚本,其中.htaccess将auto_prepend_file设置为完全在网站结构之外的文件的硬编码路径,设置包含路径(除其他外)到网络结构内的某个地方。
答案 2 :(得分:0)
使用选项&#39; noserverino&#39;安装CIFS共享应该解决这个问题,例如:
mount -t cifs -o noserverino //host/share /mnt
可以在此处找到有关其工作原理的完整说明:http://www.php.net//manual/en/function.is-dir.php#98338