13

更新

私はCodeIgniterを放棄し、このバグを取り除く方法がなかったので、PHPからデータベースアプリケーションの周りにWebインターフェイスを構築したいと思っていました...


例外

この例外が発生します:

Fatal error: require_once(): Cannot redeclare class doctrine\orm\abstractquery in Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php on line 190

Call Stack:
    0.0007     330016   1. {main}() Q:\Digest\index.php:0
    0.0058     330800   2. require_once('Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php') Q:\Digest\index.php:163
    0.2207     935856   3. call_user_func_array() Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php:297
    0.2207     935904   4. Crud->index() Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php:0
    0.2574    1065064   5. Crud->__getEntities() Q:\Digest\Application\controllers\crud.php:19
    0.2649    1121824   6. Doctrine\ORM\AbstractQuery->getResult() Q:\Digest\Application\controllers\crud.php:49
    0.2649    1121976   7. Doctrine\ORM\AbstractQuery->execute() Q:\Digest\lib\Doctrine\ORM\AbstractQuery.php:366
    0.2651    1121976   8. Doctrine\ORM\Query->_doExecute() Q:\Digest\lib\Doctrine\ORM\AbstractQuery.php:528
    0.2651    1121976   9. Doctrine\ORM\Query->_parse() Q:\Digest\lib\Doctrine\ORM\Query.php:223
    0.2848    1185896  10. Doctrine\ORM\Query\Parser->parse() Q:\Digest\lib\Doctrine\ORM\Query.php:203
    0.3089    1238704  11. Doctrine\ORM\Query\SqlWalker->getExecutor() Q:\Digest\lib\Doctrine\ORM\Query\Parser.php:311
    0.3090    1239104  12. Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
    0.3107    1241104  13. require_once('Q:\Digest\lib\Doctrine\ORM\Query\Exec\SingleSelectExecutor.php') Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:190
    0.3108    1241440  14. Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0

UniversalClassLoader上記のように、データ分析スクリプトを実装するために、SymfonyとともにDoctrine2.0を使用しています。結果を表示するために、CodeIgniterプロジェクトを設定しました。

この例外で私が困惑したのは次のとおりです。私はほとんどすべての合理的な原因を排除しましたが、何も見つかりませんでした。ここのエリミネーションラウンドで何か間違ったことをしたかどうか教えてください。

ここで何がうまくいかないかについて誰かが何か手がかりを持っているなら、助けてください。私が忘れている情報があると思われる場合も、教えてください。

ありがとうございました。


重複する宣言の排除

クラスを再定義できないことを教えてくれます。すべてのファイルをgrepしましたが、このクラスは特定のファイル「Doctrine / ORM/AbstractQuery.php」でのみ定義されています。

最初にエラーがrequireSymfonyUniversalClassLoader.phpの行190の呼び出しで報告されたことに注意してください。これを変更しrequire_onceて、ファイルが2回ロードされないようにしました。


大文字と小文字を区別するファイルシステムの排除

ここで見つけたメモのために、私はWindows7でPHP5.3.5を実行していることを共有する必要があると思います。これは、以下で説明するバグ/機能が影響を及ぼさないことを意味するはずです。

この動作はPHP5で変更されたため、たとえばWindowsでは、パスが最初に正規化され、C:\ PROGRA〜1 \ A.phpがC:\ Program Files \ a.phpと同じように実現され、ファイルが1回だけ含まれるようになります。 。


require重複の排除

これで、すべてのライブラリ(および自分のコード)の関数requireへのすべての呼び出しを1から1に置き換えることができましrequire_onceたが、エラーは変わりません。requireこれは、への呼び出しには責任がないと安全に言えることを意味します。私の質問は残っています:何ですか?


デバッガー出力

デバッガーを実行しても、まったく何も起こりません。

    ...
    0.4658    1274904                       -> Doctrine\ORM\Query\SqlWalker->getExecutor() Q:\Digest\lib\Doctrine\ORM\Query\Parser.php:311
    0.4660    1275304                         -> Logger::autoload() Q:\Digest\lib\Log4PHP\Logger.php:0
    0.4662    1275304                         -> Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
    0.4663    1275384                           -> strripos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:183
    0.4665    1275400                           -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:185
    0.4666    1275488                           -> strpos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:187
    0.4667    1275520                           -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:188
    0.4668    1275672                           -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
    0.4669    1275696                           -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
    0.4671    1275656                           -> file_exists() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:190
    0.4700    1277304                           -> require_once(Q:\Digest\lib\Doctrine\ORM\Query\Exec\SingleSelectExecutor.php) Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:192
    0.4702    1277640                             -> Logger::autoload() Q:\Digest\lib\Log4PHP\Logger.php:0
    0.4703    1277640                             -> Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
    0.4704    1277720                               -> strripos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:183
    0.4706    1277736                               -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:185
    0.4707    1278280                               -> strpos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:187
    0.4708    1278312                               -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:188
    0.4709    1278464                               -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
    0.4711    1278488                               -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
    0.4712    1278448                               -> file_exists() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:190
    0.5259 zu
TRACE END   [2011-03-28 11:28:00]

いくつかの追加の検査は、クラッシュ中にロードしているファイルが lib\Doctrine\ORM\Query\Exec\AbstractSqlExecutor.php、またはAbstractSqlExecutorクラスであると教えてくれます...したがって、完全に無関係なものです。

4

8 に答える 8

7

私が考えることができる他の可能性(これまでに提案された答えをざっと読んだ後)は次のとおりです。

  1. たぶん、ソースツリーのどこかにシンボリックリンクがありますか?(パスが異なって見える場合、require_once()は、同じファイルをインポートしていることを知るのに十分賢くないことがわかりました)。

  2. おそらく、包含依存関係のどこかにサイクルがありますか?(AがAを含むCを含むBを含む場合、require_once()はサイクルを中断するほど賢くないことがわかりました)。

于 2011-07-25T18:30:40.230 に答える
4

あなたが諦めたのは残念だ。それを修正する簡単な方法は、次のようにすることです。

if (!class_exists('ClassName')) {


}

ファイルの周り。これはバグを修正するのではなく、症状が消えるだけです。残念ながら、CodeigniterはPHP5オブジェクトのインスタンス化についてあまり賢くなく、コードを2回ロードしている可能性があります。

于 2011-06-16T02:22:17.307 に答える
3

サーバーにAPCがインストールされているかどうかを確認してください。その場合は、オフにするか、apc.include_once_override設定を0にアップグレードまたは設定してください。

于 2011-03-29T12:14:19.073 に答える
2

どこかで__autoload()を使用していますか?2つの異なるファイルで同じクラスが実際に定義されていない限り、それが私が考えることができる唯一のことです。

于 2011-03-31T16:47:25.660 に答える
1

明らかな解決策をすべて調べた場合、この問題が発生するたびに、通常はAPCでのキャッシュの問題が発生します。

これがapcキャッシュの問題である場合、それを修正するには、ファイルの先頭にある最上位ファイルに以下を追加します。

apc_clear_cache();

問題が解消された場合は、それが問題であったことがわかります。特に共有ホスティング環境では、ファイルが変更されている場合、APCはほとんど使用できないことがわかったので、呼び出すことができる最上位のファイルに常にそれを追加します。

PS:APCが間違ったファイルをキャッシュしたように見える状況に遭遇したこともあります。そのため、不平を言っているクラスが明らかにないファイルを含めると、クラッシュします。

于 2015-03-10T23:06:34.397 に答える
0

UniveralClassLoader次のような複数の方法で含める場合:

  1. 終えたrequire_once
  2. 使用するSymfony\Component\ClassLoader\UniversalClassLoader;

その場合、致命的なエラーは、コンパイラがクラスの再宣言と見なすものによって引き起こされる可能性があります。行が存在する場合は削除require_onceし、2番目のオプションを使用します。

于 2011-03-15T10:45:08.170 に答える
0

2つのファイルで同じクラスが定義されている場合があります。その場合、require_once()は役に立ちません

于 2011-03-31T14:48:10.937 に答える
0
 root
  + a.php
  + c/
     +c.php
     + b.php

_ a.php _

require_once 'c/b.php'; -> will work
require_once 'c/c.php'; -> will work

_ c / b.php _

require_once 'c.php'; -> will work too 'c/c.php'!='c.php' :(
于 2015-02-18T11:01:49.660 に答える