0

我有几个看起来像这样的文件:

索引.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]:失败在第 2 行的 [dir]/includes/header.php 中打开所需的 'config.php' (include_path='.:/usr/share/pear:/usr/share/php')

我做了一些进一步的调试:当我添加调用时

system('pwd');

到includes/header.php,它显示[dir],它应该说[dir]/includes。将“includes/”添加到包含路径是可行的,但不可取,因为这会在生产服务器上失败。

上面的代码在生产服务器上运行,在我的开发 Fedora 服务器上运行良好,直到我尝试更改我的开发环境,以便 Fedora 服务器的文档根目录是一个挂载的 CIFS 共享。

有任何想法吗?谢谢。

4

3 回答 3

0

工作得很好......直到我尝试更改我的开发环境,以便 Fedora 服务器的文档根目录是一个已挂载的 CIFS 共享。

是否启用了 SELinux?

查看/var/log/audit/audit.log

我打赌 SELinux 已启用并处于强制模式,并且正在干扰。

于 2010-06-12T02:49:28.803 回答
0

我不想这么说,但是pwd您所描述的行为是 100% 预期的行为(并且至少从 PHP4 开始......可能更早)。

PHP 自动设置当前工作目录(由 pwd 使用)一次。PHP 不会改变它。因此, 。除非您使用 chdir() 手动更改它,否则将引用原始的当前工作目录。

这个问题有多种解决方案;其中大部分您可以在PHP 中看到所需的包含文件策略

如果它以前有效,则可能在某处对 include_path 进行了一些更新,更改工作目录的代码不再更改它,或者您使用的实现这种奇怪(但更预期)行为的 php 版本不再这样做。

无论如何,我会检查包含路径:ini 文件或更改包含路径的脚本。我猜测用于更新 include_path 的东西,但不再这样做了。

我不确定您如何移动它的详细信息,但我遇到了一些烦人的脚本,其中 .htaccess 将 auto_prepend_file 设置为完全位于网站结构之外的文件的硬编码路径,该路径设置包含路径(除其他外) ) 到网络结构内的某个地方。

于 2010-06-12T04:28:23.777 回答
0

使用选项“noserverino”挂载 CIFS 共享应该可以解决问题,例如:

mount -t cifs -o noserverino //host/share /mnt

可以在此处找到有关此工作原理的完整说明:http ://www.php.net//manual/en/function.is-dir.php#98338

于 2014-06-11T06:29:31.903 回答