Domanda

Aggiorna :

ho abbandonato CodeIgniter, e il desiderio di costruire un'interfaccia web intorno alla mia applicazione di database da PHP, come non c'era modo di sbarazzarsi di questo bug ...


L'eccezione

ottengo questa eccezione:

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

Sto usando Doctrine 2.0, con il UniversalClassLoader Symfony, come si può vedere sopra, per implementare uno script di analisi dei dati. Per visualizzare i risultati, ho predisposto un progetto di CodeIgniter.

Ecco quello che mi ha sconcertato con questa eccezione: ho eliminato quasi tutti ragionevolmente cause, e ha trovato nulla. Dimmi se ho fatto qualcosa di sbagliato nei turni elemination qui.

Se qualcuno ha qualche indizio di sorta su ciò che potrebbe andare male qui, si prega di aiuto. Se si pensa che ci sono tutte le informazioni che ho lasciato fuori, anche, la prego di dirmi.

Grazie.


Eliminare duplicati dichiarazioni

E mi dice che non posso ridefinire una classe. Ho grepped tutti i miei file, e questa classe è definita solo nel suo specifico file "Dottrina / ORM / AbstractQuery.php".

Si noti che inizialmente l'errore è stato segnalato alla chiamata a require alla linea 190 del Symfony UniversalClassLoader.php, e ho cambiato questo per require_once per assicurarsi che il file non viene caricato due volte.


Eliminando il file system maiuscole e minuscole

A causa della nota che ho trovato href="http://www.php.net/manual/en/function.include-once.php" qui , credo è che avrei dovuto condividere che sto correndo PHP 5.3.5 su Windows 7. Questo dovrebbe significa che il bug / funzione descritta di seguito è di alcuna influenza.

Questo comportamento è cambiato in PHP 5, così ad esempio in Windows il percorso è normalizzato, in modo che C: \ PROGRA ~ 1 \ A.php si realizza lo stesso come C: \ Program Files \ a.php e il file è incluso solo una volta.


Eliminare require duplicazione

Ho ormai andato al punto di sostituire ogni singola chiamata in ogni libreria (e il mio codice) per la funzione require a uno a require_once, ei persiste errore invariato. Questo significa che ora posso dire con sicurezza che nessuna chiamata a require è responsabile. La mia domanda rimane: qual è


Debugger uscita

mi Esecuzione di un debugger porta assolutamente nulla:

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

Alcuni ulteriori ispezioni mi dice che il file è di carico, mentre si arresta è lib\Doctrine\ORM\Query\Exec\AbstractSqlExecutor.php, o la classe AbstractSqlExecutor ... quindi, qualcosa di completamente estraneo.

È stato utile?

Soluzione

Le altre possibilità che posso pensare (dopo scrematura le risposte proposte finora) sono:

  1. Forse c'è un link simbolico da qualche parte nel vostro albero dei sorgenti? (Ho scoperto che require_once () non è abbastanza intelligente per sapere che si sta importando lo stesso file se il percorso è diverso).

  2. Forse c'è un qualche ciclo nelle dipendenze di inclusione? (Se A include B che comprende C che include una, ho trovato che require_once () non è abbastanza intelligente per rompere il ciclo).

Altri suggerimenti

Si prega di verificare se il server è installato APC. Se quindi cercate di spegnerlo, aggiornare o set apc.include_once_override impostazione su 0.

Peccato che ha rinunciato. Il modo più semplice per risolvere il problema sarebbe quello di mettere:

if (!class_exists('ClassName')) {


}

intorno al file. Questo non risolve il bug, fa solo il sintomo andare via. CodeIgniter purtroppo non è troppo intelligente su PHP5 istanze di oggetti, e può essere il caricamento del codice di due volte.

Si sta utilizzando __autoload () da qualche parte? Questo è l'unica cosa che mi viene in mente, a meno che in realtà hanno la stessa classe definita in due file differenti.

Se avete esplorato tutte le soluzioni ovvie, quindi ogni volta che ho eseguito in questo problema, è stato un problema di caching, in genere con APC.

Se si tratta di un problema di caching apc, per risolvere il problema, aggiungere il seguente al file di livello superiore nella parte superiore del file:

apc_clear_cache();

Se il problema scompare, poi si sa che che era il problema. In particolare sugli ambienti di hosting condiviso, se i file stanno cambiando, ho trovato APC quasi inutilizzabile, quindi ho sempre aggiungere che in un file di livello superiore che posso chiamare.

PS:. Ho anche correre in situazioni in cui sembra che APC ha memorizzato nella cache il file sbagliato, in modo che si blocca quando includo un file che chiaramente non ha mai avuto la classe è lamentarsi

Se siete tra cui UniveralClassLoader in vari modi, come ad esempio:

  1. attraverso require_once
  2. uso Symfony\Component\ClassLoader\UniversalClassLoader;

quindi l'errore fatale potrebbe essere causato da ciò che il compilatore considera la ridichiarazione della classe. Rimuovere la linea require_once se esiste e basta usare la seconda opzione.

si può avere la stessa classe definita in due file. require_once () non aiuta in questo caso

 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' :(
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top