2012-03-30 226 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