2015-01-23 14 views
10

ho qualche problema con la mia distribuzione di produzione di Symfony2,simplexml_load_file(): I/O di allarme: è riuscito a caricare un'entità esterna " /user-bundle/Resources/config/doctrine/model/User.orm.xml

Ho provato molte soluzioni, ma nessuna ha funzionato.

ho casualmente hanno questo errore quando si accede a mia applicazione symfony sul ambiente di produzione:

(!) Fatal error: Uncaught exception 'Symfony\Component\Debug\Exception\ContextErrorException' with message 'Warning: simplexml_load_file(): I/O warning : failed to load external entity "/home/user/symfony/vendor/friendsofsymfony/user-bundle/Resources/config/doctrine/model/User.orm.xml"' in /home/user/symfony/app/bootstrap.php.cache on line 2998 
(!) Symfony\Component\Debug\Exception\ContextErrorException: Warning: simplexml_load_file(): I/O warning : failed to load external entity "/home/user/symfony/vendor/friendsofsymfony/user-bundle/Resources/config/doctrine/model/User.orm.xml" in /home/user/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php on line 736 
Call Stack 
# Time Memory Function Location 
1 0.0000 262880 {main}() ../app_dev.php:0 
2 0.0015 572736 Symfony\Component\HttpKernel\Kernel->handle() ../app_dev.php:79 
3 0.1342 4023952 Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle() ../bootstrap.php.cache:2376 
(!) LogicException: Request stack is empty in /home/user/symfony/app/bootstrap.php.cache on line 2998 
Call Stack 
# Time Memory Function Location 
1 0.3330 7110120 Symfony\Component\Debug\ErrorHandler->handleException() ../classes.php:0 
2 0.3331 7119696 Symfony\Component\Debug\ErrorHandler->handleException() ../classes.php:1939 

Ho cercato di aggiornare la versione di PHP (ero in php 5.4.x ed ora in 5.6.4),

ho cercato di aggiornare la versione lixml2 (io sono in 2.8.0 ora, ma ho già provato ad aggiornare in 2.9.3)

ho constated che la versione di libxml utilizzato in php è sempre 2.8.0, ma, non ho trovato il modo di cambiare questo,

Ho provato a impostare l'intera directory di symfony in chmod 777

Il mio server è un debian 7.5 server.

Forse qualcuno che conosce questo errore può aiutarmi

Ecco alcuni link a differents domanda relativa a questo:

Random Error, FOSUserBundle Error e Service error

io non inviare a loro perché sono tutti obsoleti

[EDIT]

ho trovato una qu ick correzione, ma è a fornitori, così sarà overrided nel primo aggiornamento dell'aggiornamento dottrina:

QuickFix in XmlDriver.php Linea 737

$xmlElement = @simplexml_load_file($file); 
if(!$xmlElement){ 
     $xmlData = file_get_contents($file); 
     $xmlElement = simplexml_load_string($xmlData); 
} 
+0

Ci può spiegare di più come è risolto il problema? Grazie ... –

+0

Oltre al fatto che cambi fornitore, ma aggiungendo un @ per nascondere un errore fatale è peggio, lo script php si ferma e non te ne accorgi nemmeno, funzionerà senza errori ma noterai che comportamento strano dopo quello senza sapere perché. –

+0

Sì, sono consapevole che questo quickfix non è una soluzione, ma è meglio di niente! – PyRowMan

risposta

0

abbiamo ottenuto questo errore dopo abbiamo iniziato a utilizzare libxml_disable_entity_loader(true); nel nostro codice. Questo codice è fondamentale per prevenire gli attacchi XXE (maggiori informazioni su questo in here). Se non lo hai nel tuo codice, potrebbe essere che hai installato/aggiornato un pacchetto che ha quella linea di codice in uso. Notare che libxml_disable_entity_loader() non è thread-safe, quindi se c'è un pezzo di codice su un thread che esegue quella linea, tutto su quel server ora è abilitato in tutto il processo.

Il bundle FOS sembra utilizzare definizioni xml, che in cambio hanno entità esterne in esse. Niente di importante, ma quel codice impedisce ai metodi FOS-bundles di usare questi file correttamente.

Per fortuna, il nostro servizio ottenuto che l'errore solo in un posto, e la correzione era evidente: Aggiungere un libxml_disable_entity_loader(false); prima di eseguire quel pezzo di codice in cui l'errore viene, e aggiungere libxml_disable_entity_loader(true); subito dopo quel pezzo di codice. In questo modo il pacchetto utente potrebbe caricare xml: s necessario, ma la sicurezza non è compromessa.

Esempio:

libxml_disable_entity_loader(false); 
$user = $query->getOneOrNullResult(); // This generates an error if entity loader is disabled 
libxml_disable_entity_loader(true);