2015-01-23 4 views
10

Mam problem z moim wdrożenia produkcyjnego Symfony2,simplexml_load_file(): I/O ostrzeżenie: nie udało się załadować podmiot zewnętrzny " /user-bundle/Resources/config/doctrine/model/User.orm.xml

Próbowałem wielu rozwiązań, ale żaden z nich nie zadziałał.

ja losowo ten błąd podczas uzyskiwania dostępu do mojej aplikacji symfony na środowisku produkcyjnym:

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

Próbowałem uaktualnić swoją wersję php (byłem w php, a teraz w wersji conajmniej 5.4.x 5.6.4),

próbowałem uaktualnić wersję lixml2 (jestem w 2.8.0 teraz, ale ja już próbowałem uaktualnić w 2.9.3)

mam constated że wersja libxml używane w PHP jest zawsze 2.8.0, ale nie znalazłem sposobu, aby to zmienić,

Próbowałem ustawić cały katalog symfony w usłudze chmod 777

Mój serwer jest serwerem debian 7.5.

Może ktoś, kto wie, ten błąd może mi pomóc

Oto linki do zróżnicowanych pytanie związane z tym jednym:

Random Error, FOSUserBundle Error i Service error

I nie pisać w nich, ponieważ wszystkie są przestarzałe

[EDIT]

znalazłem qu ick naprawić, ale to w sprzedawców, więc będzie overrided w pierwszej aktualizacji aktualizacji nauką

QuickFix w XmlDriver.php Linia 737

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

Czy możesz powiedzieć coś więcej, jak problem został rozwiązany? Dzięki ... –

+0

Poza tym, że zmieniłeś sprzedawcę, który jest zły, dodanie znaku @ w celu ukrycia fatalnego błędu jest gorsze, twój skrypt php zatrzymuje się i nawet nie zdajesz sobie z tego sprawy, będzie dobrze wyglądać bez błędu, ale zauważysz trochę dziwne zachowanie po tym, nie wiedząc dlaczego. –

+0

Tak, mam świadomość, że ta poprawka nie jest rozwiązaniem, ale jest lepsza niż nic! – PyRowMan

Odpowiedz

0

mamy ten błąd po rozpoczęciu korzystania libxml_disable_entity_loader(true); w naszym kodzie. Ten kod jest niezbędny w zapobieganiu atakom XXE (więcej informacji na ten temat w here). Jeśli nie masz tego w swoim kodzie, może to oznaczać, że zainstalowałeś/zaktualizowałeś pakiet, który ma ten wiersz kodu w użyciu. Zauważ, że libxml_disable_entity_loader() nie jest bezpieczny dla wątków, więc jeśli istnieje jeden fragment kodu w jednym wątku, który wykonuje tę linię, wszystko na tym serwerze ma teraz włączone w procesie.

Pakiet FOS wydaje się używać definicji xml, które w zamian zawierają w sobie elementy zewnętrzne. Nic poważnego, ale ten kod uniemożliwia systemom FOS używanie tych plików poprawnie.

Na szczęście, nasz serwis ma ten błąd tylko w jednym miejscu, a poprawka była oczywista: Dodaj libxml_disable_entity_loader(false); przed wykonaniem ten kawałek kodu gdzie błąd pochodzi, i dodać libxml_disable_entity_loader(true); zaraz po tym kawałku kodu. W ten sposób pakiet użytkownika może załadować xml: s to potrzebne, ale bezpieczeństwo nie jest zagrożone.

Przykład:

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