2009-09-01 14 views
7

PHPコードをキャッシュするためのオペコードとしてAPCまたはXCacheを使用しようとしています。私はZendとDoctrineで使用していますが、オートローダに問題があります。Opcode(APC/XCache)、Zend、Doctrine、and Autoloaders

私は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を実行していますよWindowsのボックスに。次のように

私のブートストラップは、次のとおりです。

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

+0

register_shutdown_functionのクレジットは、ホグベルグと戦闘に行く。 –

0

他にもインクルードパスがありますか?おそらく、最初のAPCの例で、その行の直前にインクルード・パスをログアウトしてみてください。

XCacheは本当に奇妙です。そのプロジェクトはかなり死んでいますが、私はPHP 5.2以降でそれを信用しませんでした。代わりにeacceleratorを試してみませんか?私たちはそれに最高の幸運を持っていました。

+0

includeパスに他のDoctrine固有のものがあります(モデルなど)。 私たちはZendCacheバックエンド(http://framework.zend.com/manual/en/zend.cache.backends.html)を探しているので、eacceleratorは動作しません。 –

+0

eacceleratorバックエンドの提案http://framework.zend.com/wiki/display/ZFPROP/Zend_Cache_Backend_Eaccelerator+-+Federico+Cargnelutti - 実際に実装するのはかなり簡単なはずです。とにかく私は何かがエラーがスローされる前に合計からあなたの意図したインクルードパスを削除している場合は疑問に思った。 – Justin

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

ベンジャミンクレマー、あなたは命の恩人です。上記の(元の)問題は、セッションによる自動ロードの特別なケースですが、セッションを閉じることは、そのような場合の一般的な解決策であるようです。あなたのコードにexit;die();などがある可能性があるので、

スクリプトの最後に配置すると、必ずしもそれをカットしないことがあります。あなたは、セッションのためのZendを使用しない場合は、このケースでは、単に

register_shutdown_function('session_write_close');

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

を使用したりすることができます。

関連する問題