2015-01-23 7 views
10

Ich habe einiges Problem mit meinem Produktions Einsatz von Symfony2,simplexml_load_file(): I/O-Warnung: failed externe Einheit laden " /user-bundle/Resources/config/doctrine/model/User.orm.xml

Ich habe viele Lösungen ausprobiert, aber keine hat funktioniert.

ich diesen Fehler zufällig habe, wenn meine symfony-Anwendung auf Produktionsumgebung zugreifen:

(!) 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 

Ich habe versucht, meine PHP-Version (ich war in PHP 5.4.x und jetzt in 5.6.4) zu aktualisieren,

ich habe versucht, lixml2 Version zu aktualisieren (ich bin in 2.8.0 jetzt, aber ich versuchte bereits in 2.9.3 zu aktualisieren)

ich, dass die Version von libxml in pHP verwendet constated habe, ist immer 2.8.0, aber, ich habe nicht den Weg gefunden, dies zu ändern,

Ich habe versucht, das gesamte Verzeichnis von Symfony in chmod 777

Mein Server ist ein Debian 7.5 Server.

Vielleicht jemand, der diesen Fehler kennt mich

helfen kann

Hier einige Links zu differents Frage zu diesem Zusammenhang:

Random Error, FOSUserBundle Error und Service error

ich nicht in sie schreiben habe, weil sie sind alle veraltet

[EDIT]

ich qu gefunden ick fix, aber es ist in Anbieter, so wird es in der ersten Aktualisierung der Lehre Update overrided werden:

QuickFix in XmlDriver.php Linie 737

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

Können Sie erklären, wie Sie das Problem behoben? Danke ... –

+0

Neben der Tatsache, dass Sie Anbieter, die schlecht ist, ändern, fügen Sie ein @ um einen schwerwiegenden Fehler zu verbergen ist schlimmer, Ihr PHP-Skript stoppt und Sie nicht einmal erkennen, es wird gut aussehen ohne Fehler, aber Sie werden einige bemerken seltsames Verhalten danach, ohne zu wissen warum. –

+0

Ja, ich bin mir bewusst, dass dieser Quickfix keine Lösung ist, aber es ist besser als nichts! – PyRowMan

Antwort

0

wir haben diesen Fehler, nachdem wir mit libxml_disable_entity_loader(true); in unserem Code gestartet. Dieser Code ist unerlässlich, um XXE-Angriffe zu verhindern (mehr dazu in here). Wenn Sie dies nicht in Ihrem Code haben, könnte es sein, dass Sie ein Bundle installiert/aktualisiert haben, das diese Codezeile verwendet. Beachten Sie, dass nicht threadsicher ist. Wenn also ein Code in einem Thread vorhanden ist, der diese Zeile ausführt, ist dies auf dem Server während des gesamten Prozesses aktiviert.

Das FOS-Paket scheint XML-Definitionen zu verwenden, die wiederum externe Entitäten enthalten. Nichts wichtiges, aber dieser Code verhindert, dass die FOS-Bundles-Methoden diese Dateien korrekt verwenden.

Zum Glück, unser Service bekam diesen Fehler nur an einer Stelle, und das Update war offensichtlich: ein libxml_disable_entity_loader(false); hinzufügen, bevor das Stück Code ausgeführt wird, wo der Fehler herkommt, und fügen Sie libxml_disable_entity_loader(true); rechts nach diesem Stück Code. Auf diese Weise konnte das Benutzerpaket die erforderlichen xml: s laden, die Sicherheit wurde jedoch nicht beeinträchtigt.

Beispiel:

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