オペコード (APC/XCache)、Zend、Doctrine、およびオートローダー
-
21-09-2019 - |
質問
PHPページをキャッシュするためのオペコードとして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
Windows ボックスで Zend 1.9.1、Doctrine 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 の使用がほぼ必須ですが、それを機能させることができないようです。何か案は?
解決
「」を入れることもできますZend_Session::writeClose(true);
" をindex.phpの最後に追加します。
これにより、必要なオブジェクト (Zend_Loader など) が破棄される前に、セッションが永続的な状態に書き込まれます。
より良い:として登録します シャットダウン機能.
したがって、使用しても実行されます exit()
, die()
または fatal error
発生します:
register_shutdown_function(array('Zend_Session', 'writeClose'), true);
他のヒント
これはおそらく、カスタムのセッション処理やAPCキャッシュでの問題に似ています。カスタムセッションハンドラを割り当てた場合、それはPHPにRSHUTDOWNに登録されています。それは、APCが使用し、そのためのすべての状況を中に閉じませんPHPおよびカスタムセッションハンドラで内部対立を作成するのと同じルーチンです。
あなたが手動でシャットダウン時にカスタムセッションハンドラを閉じることを確認する必要がありますので、
あなたのindex.phpの終わりに"Zend_Session::writeClose(true);"
を置くあなたが任意の終了を持っている場合にはそれを行うための最善の方法ではありません。どこでもあなたのスクリプトで呼び出します。
このように遮断ハンドラを登録することをお勧めします:
function shutdown()
{
Zend_Session::writeClose(true);
}
register_shutdown_function('shutdown');
他のスクリプトが実行される前に、シャットダウン手順が登録されていることを確認するためにあなたのindex.phpファイルの先頭にそれを置きます。
何か他のものインクルードパスをいじくるありますか?多分右のあなたの最初のAPCの例では、その行の前にインクルードパスをログアウトしてみます。
XCacheと1は本当に奇妙です。そのプロジェクトはかなりかかわらず死んでいる、と私はPHP 5.2+の上にそれを信用していないと思います。試してみてくださいeAcceleratorの代わりに?我々はそれで最高の運を持っていた。
ベンジャミン・クレーマー、あなたは命の恩人です。上記の(元の)問題はセッションによる自動読み込みの特殊なケースですが、そのような場合にはセッションを閉じることが一般的な解決策であるようです。ただしメモ:
配置する Zend_Session::writeClose(true);
スクリプトの最後で必ずしもカットされるとは限りません。 exit;
さんの、 die();
などをコードに含めます。この場合、使用できます
register_shutdown_function(array('Zend_Session', 'writeClose'), true);
または、単に
register_shutdown_function('session_write_close');
セッションに Zend を使用しない場合。