Question

UPDATE :

Je l'ai abandonné CodeIgniter, et le désir de construire une interface web autour de mon application de base de données PHP, car il n'y avait aucun moyen de se débarrasser de ce bug ...


L'exception

je reçois cette exception:

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

J'utilise Doctrine 2.0, avec le UniversalClassLoader Symfony, comme on peut le voir ci-dessus, pour mettre en œuvre un script d'analyse de données. Pour voir les résultats, je l'ai mis en place un projet CodeIgniter.

Voici ce qui m'a déconcerté à cette exception: je l'ai éliminé presque toutes les causes raisonnablement, et n'a rien trouvé. Dites-moi si j'eu tort de quelque chose dans les tours de elemination ici.

Si quelqu'un a la moindre idée que ce soit au sujet de ce qui pourrait aller mal ici, s'il vous plaît aider. Si vous pensez qu'il ya des informations que j'ai omis, aussi, s'il vous plaît me dire.

Merci.


L'élimination en double déclarations

Il me dit que je ne peux pas redéfinir une classe. J'ai tous mes fichiers rassemblés de, et cette classe est définie uniquement dans son fichier spécifique "Doctrine / ORM / AbstractQuery.php".

Notez que d'abord l'erreur a été signalée à l'appel à require à la ligne 190 de la Symfony UniversalClassLoader.php, et je l'ai changé cela require_once pour vous assurer que le fichier est chargé deux fois.


L'élimination du système de fichiers sensible à la casse

En raison de la note que je trouve , je pense c'est je partage que je suis en cours d'exécution PHP 5.3.5 sur Windows 7. Cette devrait signifie le bug / fonctionnalité décrite ci-dessous est sans influence.

Ce comportement a changé en PHP 5, donc par exemple avec Windows le chemin est normalisée première de telle sorte que C: \ PROGRA ~ 1 \ A.php est réalisé le même C: \ Program Files de la a.php et le fichier est inclus une fois.


L'élimination de la duplication require

Je l'ai maintenant disparu jusqu'à remplacer chaque appel dans toutes les bibliothèques (et mon propre code) à la fonction require à un à require_once, et les erreurs persiste sans changement. Cela signifie que je peux maintenant dire en toute sécurité que aucun appel à require est responsable. Mon question demeure: quelle est


Debugger sortie

L'exécution d'un débogueur me apporte absolument rien:

    ...
    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]

Certains inspection supplémentaire me dit que le fichier son chargement alors qu'il tombe en panne est lib\Doctrine\ORM\Query\Exec\AbstractSqlExecutor.php, ou la classe AbstractSqlExecutor ... donc, quelque chose de complètement différent.

Était-ce utile?

La solution

Les autres possibilités que je peux penser (après l'écrémage des réponses proposées à ce jour) sont:

  1. Peut-être il y a un endroit dans symlink votre source? (Je l'ai trouvé que require_once () n'est pas assez intelligent pour savoir que vous importez le même fichier si le chemin est différent).

  2. Peut-être il y a un endroit de cycle dans vos dépendances d'inclusion? (Si A comprend B qui comprend C qui comprend un, j'ai trouvé que require_once () est pas assez intelligent pour briser le cycle).

Autres conseils

S'il vous plaît vérifier si votre serveur a APC installé. Dans ce cas essayer de l'éteindre, mettre à niveau ou ensemble paramètre apc.include_once_override à 0.

Dommage que vous avez donné. La façon simple de résoudre ce problème serait de mettre:

if (!class_exists('ClassName')) {


}

dans le fichier. Cela ne résout pas le bug, fait juste le symptôme aller. CodeIgniter est malheureusement pas trop intelligent sur l'objet instanciation PHP5, et peut être de charger votre code deux fois.

Utilisez-vous __autoload () nulle part? Thats la seule chose que je peux penser, à moins que vous avez fait la même classe définie dans deux fichiers différents.

Si vous avez exploré toutes les solutions évidentes, alors chaque fois que je courir dans ce problème, il a été un problème de mise en cache, généralement avec APC.

S'il est un problème de mise en cache de apc, pour le corriger, ajouter ce qui suit à votre fichier de niveau supérieur en haut du fichier:

apc_clear_cache();

Si le problème disparaît, alors vous savez que c'était la question. En particulier sur les environnements d'hébergement partagé, si les fichiers changent, j'ai trouvé APC presque inutilisable, donc j'ajoute toujours à un fichier de niveau supérieur, je peux appeler.

PS. J'ai même courir dans des situations où il semble que l'APC a mis en cache le mauvais fichier, de sorte qu'il se bloque lorsque j'inclure un fichier qui n'a jamais eu clairement la classe, il se plaint de

Si vous êtes y compris UniveralClassLoader de multiples façons, par exemple:

  1. par require_once
  2. utilisation Symfony\Component\ClassLoader\UniversalClassLoader;

l'erreur fatale peut être causée par ce que le compilateur considère la redéclaration de la classe. Retirez la ligne de require_once si elle existe et il suffit d'utiliser la deuxième option.

vous pouvez avoir la même classe définie dans deux fichiers. require_once () ne sera pas utile dans ce cas,

 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' :(
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top