2009-09-01 34 views
7

我試圖使用APC或XCache作爲操作碼來緩存我的PHP頁面。我將它與Zend和Doctrine一起使用,它在自動加載器中遇到問題。Opcode(APC/XCache),Zend,Doctrine和自動加載器

如果我嘗試用APC,我得到如下:

Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: 
    Class Doctrine_Event could not be loaded in 
    C:\\[mydir]\\library\\doctrine\\Doctrine\\Record.php on line 777 

如果我嘗試了XCache我得到如下:

PHP Fatal error: Cannot redeclare class Zend_Registry in 
    C:\\[mydir]\\library\\zendframework\\Zend\\Registry.php on line 0 

我跑的Zend 1.9.1,1.1學說在一個窗口框。

我的引導如下:

set_include_path(dirname(__FILE__).'/../library/zendframework' 
. PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine'..... 

require 'Zend/Loader/Autoloader.php'; 

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->suppressNotFoundWarnings(false); 
$loader->setFallbackAutoloader(true); 

從我讀過,使用APC或XCache將是性能幾乎是必須的,但我似乎無法得到它的工作。有任何想法嗎?

回答

10

你可以在你的index.php的末尾加上一個「Zend_Session::writeClose(true);」。
這會在必要的對象(Zend_Loader等)被破壞之前將會話寫入持久狀態。

更好:將它註冊爲shutdown function
所以,即使你使用exit()die()它會被執行或者fatal error occures:

register_shutdown_function(array('Zend_Session', 'writeClose'), true); 
+0

這爲我解決了它,使用APC。 – smoove 2009-09-24 06:39:29

+0

register_shutdown_function的積分轉到hogberg和battal。 – 2010-08-02 14:00:33

0

是否還有其他東西在包含路徑?也許嘗試在第一個APC示例中的該行之前註銷包含路徑。

XCache其實很奇怪。該項目雖然已經死了,但我不相信PHP 5.2+。試試eaccelerator?我們擁有最好的運氣。

+0

包含路徑(模型等)中還有其他特定於Doctrine的事物。 我們正在尋找一個ZendCache後端(http://framework.zend.com/manual/en/zend.cache.backends.html),因此eaccelerator不起作用。 – 2009-09-02 14:30:42

+0

Theres提出了一個eaccelerator後端http://framework.zend.com/wiki/display/ZFPROP/Zend_Cache_Backend_Eaccelerator+-+Federico+Cargnelutti - 應該很容易實現。無論如何,我想知道的是,如果有什麼東西在拋出錯誤之前從總數中移除你想要的包含路徑。 – Justin 2009-09-02 14:42:10

3

這可能是類似於自定義會話處理和APC緩存的問題。如果您已經分配了自定義會話處理程序,那麼它將在PHP中使用RSHUTDOWN進行註冊。這與APC使用的例程相同,因此會在PHP中創建內部衝突,並且您的自定義會話處理程序在所有情況下都不會關閉。

所以你必須確保你手動關閉自定義會話處理程序在關機

在你的index.php年底把一個"Zend_Session::writeClose(true);"不這樣做,如果你有任何退出的最好方式;在任何地方調用腳本。

這是更好地註冊這樣一個關機處理程序:

function shutdown() 
{ 
Zend_Session::writeClose(true); 
} 

register_shutdown_function('shutdown'); 

假如把它放在你的index.php文件的頂部,以確保任何其他腳本運行前的關機程序被註冊。

0

本傑明克雷默,你是一個拯救生命的人。雖然上述(原始)問題是自動加載會話的特例,但關閉會話似乎是這種情況的一般解決方案。儘管如此:

在腳本末尾放置Zend_Session::writeClose(true);可能並不總是削減它,因爲您的代碼中可能有exit;的,die();等。在這種情況下,你可以使用

register_shutdown_function(array('Zend_Session', 'writeClose'), true);

,或者乾脆

register_shutdown_function('session_write_close');

,如果你不使用Zend公司的會議。