具有“../”或“./”的path的PHP include / require函数失败

我今天login到我的开发服务器,发现PHP没有包含一些带有这个E_WARNING消息的文件:

警告:include_once(../ file2.php)[function.include-once]:未能打开stream:没有这样的文件或目录在/var/www/web/some_directory_1/file1.php在线任何

我用我们的系统pipe理员进行了一些研究,发现只有在path中包含'../'或'./'文件path时,PHP才会失败。

假设我们的文件结构如下所示:

在/ var / WWW /networking/
– index.php
– file2.php
– some_directory_1 /
—- file1.php
—- file3.php

如果file1.php想包含file2.php,这将工作:

include_once('/var/www/web/file2.php');

但是这不会:

include_once('../file2.php');

现在,坚持一秒钟…我知道你在想什么! “哦,他们的include_path只是FUBAR。” 那么,不完全是。

如果你在index.php中这样做,它可以工作:

include_once('some_directory_1/file1.php');

如果你在file1.php中这样做,它也可以工作:

include_once('file3.php');

我们的include_path被设置为.:/usr/lib/php 。 在过去24小时内没有任何关于服务器环境的变化(没有更新,没有新的软件,没有对包含进行更改,没有更改Apache或PHPconfiguration),我和系统pipe理员是唯一访问服务器的人过去24小时,包括昨天工作得很好。 我们用尽了可能的原因。 任何线索可能会导致这种情况发生?

编辑:忘记了PHP的警告消息。

你遇到麻烦的原因是include / require中的相对path总是相对于初始脚本 ,并且使用相对path会导致php忽略include_path值。 所以在你的例子include_once('../file2.php'); 正在寻找index.php的父文件,假设index.php是最初的脚本。

不知道为什么会突然改变。 但是,解决scheme是不使用相对path – 使用include_path或使用__DIR__ / dirname()按照注释中的build议。