2012-03-30 172 views
2

我在这个网站上看到了很多关于这个确切问题的问题,但我相当肯定我的情况有点不同。我最近从ZF 1.9.6升级到1.11.11,从那以后,我的生产服务器上停止工作。Zend Framework 1.11.11包含路径open_basedir问题

我的本地主机运行PHP 5.3.8服务器运行时5.2.11。我不确定这与它有什么关系,但我想我会提及它以防万一。

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

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

例如:

require_once 'application/models/MyModel.php'; 

但现在突然不工作了!我不得不突然前面加上一个./像这样所有的路径:

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

的问题是,有这样的认为也可能情况下手动完成,并找到所有这些,改变它。相反,我想弄清楚为什么这些路径不再在服务器上工作,但继续在我的本地主机上工作。

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

任何人都可以提供一些见解吗?谢谢!

回答

3

我怀疑它与this note办的open_basedir:

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

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

一个解决方案可能有一些PHP文档中做this note

使用。在包含路径中允许相对包含,因为它表示当前目录。然而,明确使用include'./file'比PHP始终检查每个包含的当前目录更有效。

所以当设置include路径,我想你应该修改的例子中,你链接到这样的:

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

的通知“”我在第一个正斜杠前添加了。这应该使它相对于当前的工作目录,并阻止你不必让你的包括像./file

此外,这表示这种方法效率较低,所以你也可以考虑使用诸如TextCrawler之类的工具来找到&替换多个文件。


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

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

嘿谢谢你的回复,这是非常丰富的!我会试试看,明天我会告诉你这笔交易是什么。 – 2012-03-30 08:52:57

+0

我用解决方案添加到答案中解决了这个问题。无论哪种方式,你的回答都很棒!干杯。 – 2012-04-02 11:36:17

+1

太棒了,谢谢您将答案添加到答案中,希望它可以帮助其他人在路上! – 2012-04-02 23:56:02