web-dev-qa-db-ja.com

PHP with APC:致命的なエラー:クラスを再宣言できません

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

20
Poru

次の設定の組み合わせで修正されました。

apc.include_once_override = 0
apc.canonicalize = 0
apc.stat = 0

3つすべてがないと、常にエラーが発生しますが、with 3つすべてでエラーが発生しなくなったようです:)!

13
Peter

APCを有効にするとすぐに、たくさんのPHPライブラリで同じ問題が発生しました。たくさんの髪を引っ張った後、設定apc.include_once_override = 0物事を片付けた。まだ監視していますが、問題が再発することはありません(その前に、apcキャッシュをクリアすることでエラーを引き起こすことができました)。

12
Coalpaw

このエラーは、cronで実行されているphpスクリプトでAmazonのAWS SDK for PHP2を使用しているときに発生しました。 1つの解決策は、以下に示すように、-d apc.enabled=0を介してapcを無効にすることでした。

/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php

詳細 の場合。

3
Fred Lovine

うーん、 一般的な問題 のようです:

特定のエラーメッセージから気付いたのは、zend_db_adapter_abstractをすべて小文字で記述したことです。恐ろしいフレームワークの命名スキームとオートローダーの問題は、ファイルを大文字と小文字が混在して保持し、そうなることを期待していることです。コードがこの方法でインスタンス化しようとした場合、オートローダーがそれを検出しなかった可能性があります。 APCは、内部的にinclude_onceをオーバーライドするため、ここではより特殊である可能性があります。おそらく副作用があります。

解決策は、Zendオートローダーを適応させ、ロードされたクラスと(絶対および小文字の)ファイル名のリストを手動で保持して、include_onceの代わりにプルーフチェックを行うことです。

それ以外の場合は、過度のxdebug-ingを試してください。セットアップにアクセスできなくても、ここで推測するだけです。

2
mario

最新のapc バージョンをダウンロードして使用します。

[APC]
apc.cache_by_default = 0

Apc.stat = 0の場合、サーバーはphpファイルをキャッシュにロードします。変更しても、phpは同じものをロードします。

より詳しい情報:

1
JoniJnm

異なる場所から比較的呼び出されるinclude_onceディレクティブが混同されることは、apcの既知の問題です。

したがって、include_once myclass.phpを実行してから、サブディレクトリでinclude_once ../myclass.phpを実行すると、apcはこれを混同して、異なるファイルを考え、2回ロードする可能性があります。

ただし、これは後のバージョンで修正されています。

2回ロードされたクラスにコードをドリルダウンできる場合は、クラスにclass_definedまたは呼び出し可能なものが既にロードされているかどうかを確認できます。

apc.filterディレクティブを使用して、特定のファイルがキャッシュされないようにすることもできます。

1
The Surrican

私はちょうどこれが私に起こったのですが、他のどの答えにも提案された解決策は見つかりませんでした。 Composerオートローダーと古いバージョンのZendFrameworkオートローダーを含むさまざまなオートローダーを使用しています。

この問題は、ファイル名とクラス名のわずかな名前の不一致が原因であることが判明しました。クラス名とファイル名が1文字異なります。人間が簡単に見逃す可能性のある不一致ですが、2つのオートローダーが同じファイルを連続してincludedし、エラーが発生しました。

0
ec2011