7

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を使用することは、パフォーマンスのためにほとんど必須ですが、動作させることができないようです. 何か案は?

4

4 に答える 4

10

Zend_Session::writeClose(true);index.php の最後に" " を置くことができます。
これにより、必要なオブジェクト (Zend_Loader など) が破棄される前に、セッションが永続的な状態に書き込まれます。

ベター:シャットダウン関数として登録してください。したがって、 を使用した場合
でも実行されます。exit()die()fatal error

register_shutdown_function(array('Zend_Session', 'writeClose'), true);
于 2009-09-23T13:09:03.870 に答える
3

これはおそらく、カスタム セッション処理と APC キャッシュの問題に似ています。カスタム セッション ハンドラを割り当てた場合、それは PHP の RSHUTDOWN に登録されます。これは APC が使用するのと同じルーチンであるため、PHP で内部競合が発生し、カスタム セッション ハンドラーはすべての状況で終了しません。

そのため、シャットダウン時にカスタム セッション ハンドラを手動で閉じる必要があります。

"Zend_Session::writeClose(true);"出口がある場合、index.php の最後にa を置くのは最善の方法ではありません。どこでもスクリプトを呼び出します。

次の方法でシャットダウン ハンドラを登録することをお勧めします。

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

register_shutdown_function('shutdown');

それを index.php ファイルの一番上に置いて、他のスクリプトが実行される前にシャットダウン手順が登録されていることを確認してください。

于 2010-03-01T14:46:31.477 に答える
0

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

XCache のものは本当に奇妙です。ただし、そのプロジェクトはかなり死んでおり、PHP 5.2+ では信頼できません。代わりにeacceleratorを試してみませんか?私たちはそれで最高の幸運を手に入れました。

于 2009-09-01T21:56:34.080 に答える
0

ベンジャミン・クレマー、あなたは命の恩人です。上記の (元の) 問題はセッションのオートロードの特殊なケースですが、セッションを閉じることがそのようなケースの一般的な解決策のようです。ただし、注意:

コードに 、 などがある場合があるため、スクリプトの最後に配置Zend_Session::writeClose(true);しても必ずしもそれがカットされるとは限りません。この場合、使用できますexit;die();

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

または、単に

register_shutdown_function('session_write_close');

セッションに Zend を使用しない場合。

于 2010-07-14T07:37:56.817 に答える