APC 和 Symfony2 的 open_basedir 問題

APC 和 Symfony2 的 open_basedir 問題

我目前正在為我們的一個應用程式設定一個共享的臨時環境,該環境是用 PHP5.3 編寫並使用 Symfony2 框架的。

如果我只在每台伺服器上託管一個應用程式實例,那麼一切都會按預期運行。

但是,如果我隨後部署應用程式的其他實例(可能會也可能不會共用完全相同的程式碼,具體取決於客戶端自訂),我會收到以下錯誤:

[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Warning:  require(/var/www/vhosts/application1/httpdocs/vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php): failed to open stream: Operation not permitted in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Fatal error:  require(): Failed opening required '/var/www/vhosts/application1/httpdocs/app/../vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193

基本上,第二個網站嘗試從第一個網站取得文件,但由於 open_basedir 限制,它無法做到這一點。我不願意禁用 open_basedir 因為這只是掩蓋問題而不是解決問題,並在應用程式之間創建了不應該存在的依賴關係。

我最初認為這與 Symfony2 錯誤有關,但現在我已將其追溯到 APC 的問題;停用 APC 也可以解決該錯誤,但我擔心這樣做會對效能產生影響。

有人對我能做什麼有什麼建議嗎?

答案1

好吧,事實證明這是我們自己的程式碼的問題,而不是 APC 或 Symfony2 的任何特定錯誤。

供其他可能遇到此問題的人參考:

  1. 我們使用 Symfony2 中的 ApcUniversalClassLoader 元件。

  2. 這允許您為快取檔案指定前綴。

  3. 該前綴在我們應用程式的每個實例中都是相同的;這就是為什麼只要每台伺服器只有一個實例它就可以正常工作。

  4. 由於前綴相同,APC 嘗試載入屬於應用程式第一個實例的類,該實例是在伺服器重新啟動後立即存取的。

  5. 將應用程式的每個實例的前綴更改為不同的前綴可以使行為正確,從正確的資料夾載入類別。

希望這能防止其他人在意識到為什麼它不起作用時把頭從桌子上撞下來:)

相關內容