Zend Framework 1.11.11包含路径open_basedir问题

时间:2012-03-30 00:42:08

标签: php zend-framework relative-path include-path

我在这个网站上看到过关于这个问题的一些问题,但我很确定我的情况有点不同。我最近从ZF 1.9.6升级到1.11.11,从那时起我的生产服务器停止了工作。

我的localhost运行PHP 5.3.8 ,而服务器正在运行 5.2.11 。我不确定这与它有什么关系,但我想我会提到它以防万一。

当我第一次升级框架时,我遇到了一堆open_basedir restriction in effect.错误。通过从index.php文件中调用get_include_path()中删除set_include_path(),我解决了其他几个提到的问题。 As mentioned here

修复了open_basedir错误,但现在我在其他地方遇到了问题。由于各种原因,在几个不同的文件中,我使用 relative 路径通过includerequire语句包含文件。

例如:

require_once 'application/models/MyModel.php';

但是现在突然间不再起作用了!我不得不突然用这样的./前缀所有这些路径:

require_once './application/models/MyModel.php';

问题是,还有一种方法可以手动通过并找到所有这些并进行更改。相反,我想找出为什么这些路径不再在服务器上工作但继续在我的localhost上工作。

我的意思是,它与我在index.php文件中不再包含get_include_path() set_include_path()部分这一事实有关,但我不确定。

有人可以提供一些见解吗?谢谢!

1 个答案:

答案 0 :(得分:3)

我怀疑它与this note有关open_basedir有关:

  

使用open_basedir指定的限制是自PHP 5.2.16和5.3.4以来的目录名。以前的版本使用它作为前缀。

将其作为前缀检查并将其作为目录检查之间的区别肯定会导致这样的问题。

解决方案可能与PHP文档中的this note有关:

  

使用。在include路径中允许相对包含,因为它表示当前目录。但是,显式使用include'。/ file'比让PHP始终检查每个include的当前目录更有效。

因此,在设置包含路径时,我认为您应该修改链接到的示例,如下所示:

set_include_path(
    APPLICATION_PATH . './../library' . PATH_SEPARATOR .
    APPLICATION_PATH . './../library/Zend'
);

注意“。”我在第一个正斜杠之前添加了。这应该使它相对于当前的工作目录,并阻止您像./file那样制作包含。

此外,这说明这种方法效率较低,因此您也可以考虑使用TextCrawler之类的工具来查找&替换多个文件。


此外,您可以在设置时在include路径中包含'。'(当前目录 - 或文档根)。像这样:

set_include_path(APPLICATION_PATH . '../library' 
    . PATH_SEPARATOR . APPLICATION_PATH . '../library/Zend' 
    . PATH_SEPARATOR . '.' // <-- notice this!
);