APC for PHP with PECLをインストールしたので、次のエラーが発生することがあります:_Cannot redeclare class xxx
_
xxxは時々変更されます。 APCを無効にすることもできますが、APCによってパフォーマンスが大幅に向上します。既知のバグがありますか、またはこれらのエラーを防ぐために何か他のことをすることができますか?私はUbuntu8.04LTSをPHP 5.2.4で使用しています。
編集/更新(コメントから):
Zend Framework Autoloaderを使用していますが、APCを有効にするまでこれらのエラーは発生しませんでした。少し前に、たとえば次のエラーが発生します:Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27
次の設定の組み合わせで修正されました。
apc.include_once_override = 0
apc.canonicalize = 0
apc.stat = 0
3つすべてがないと、常にエラーが発生しますが、with 3つすべてでエラーが発生しなくなったようです:)!
APCを有効にするとすぐに、たくさんのPHPライブラリで同じ問題が発生しました。たくさんの髪を引っ張った後、設定apc.include_once_override = 0
物事を片付けた。まだ監視していますが、問題が再発することはありません(その前に、apcキャッシュをクリアすることでエラーを引き起こすことができました)。
このエラーは、cron
で実行されているphpスクリプトでAmazonのAWS SDK
for PHP2
を使用しているときに発生しました。 1つの解決策は、以下に示すように、-d apc.enabled=0
を介してapc
を無効にすることでした。
/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php
詳細 の場合。
うーん、 一般的な問題 のようです:
特定のエラーメッセージから気付いたのは、zend_db_adapter_abstract
をすべて小文字で記述したことです。恐ろしいフレームワークの命名スキームとオートローダーの問題は、ファイルを大文字と小文字が混在して保持し、そうなることを期待していることです。コードがこの方法でインスタンス化しようとした場合、オートローダーがそれを検出しなかった可能性があります。 APCは、内部的にinclude_once
をオーバーライドするため、ここではより特殊である可能性があります。おそらく副作用があります。
解決策は、Zendオートローダーを適応させ、ロードされたクラスと(絶対および小文字の)ファイル名のリストを手動で保持して、include_onceの代わりにプルーフチェックを行うことです。
それ以外の場合は、過度のxdebug-ingを試してください。セットアップにアクセスできなくても、ここで推測するだけです。
最新のapc バージョンをダウンロードして使用します。
[APC]
apc.cache_by_default = 0
Apc.stat = 0の場合、サーバーはphpファイルをキャッシュにロードします。変更しても、phpは同じものをロードします。
より詳しい情報:
異なる場所から比較的呼び出されるinclude_once
ディレクティブが混同されることは、apcの既知の問題です。
したがって、include_once myclass.php
を実行してから、サブディレクトリでinclude_once ../myclass.php
を実行すると、apcはこれを混同して、異なるファイルを考え、2回ロードする可能性があります。
ただし、これは後のバージョンで修正されています。
2回ロードされたクラスにコードをドリルダウンできる場合は、クラスにclass_defined
または呼び出し可能なものが既にロードされているかどうかを確認できます。
apc.filter
ディレクティブを使用して、特定のファイルがキャッシュされないようにすることもできます。
私はちょうどこれが私に起こったのですが、他のどの答えにも提案された解決策は見つかりませんでした。 Composerオートローダーと古いバージョンのZendFrameworkオートローダーを含むさまざまなオートローダーを使用しています。
この問題は、ファイル名とクラス名のわずかな名前の不一致が原因であることが判明しました。クラス名とファイル名が1文字異なります。人間が簡単に見逃す可能性のある不一致ですが、2つのオートローダーが同じファイルを連続してinclude
dし、エラーが発生しました。