Simplexml_load_file(): предупреждение ввода-вывода: не удалось загрузить внешний объект "/user-bundle/Resources/config/doctrine/model/User.orm.xml

У меня есть проблема с моим производственным развертыванием Symfony2,

Я пробовал много решений, но никто не работал.

Я случайно получаю эту ошибку при доступе к моему приложению symfony в рабочей среде:

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

Я попытался обновить свою версию php (я был в php 5.4.x и теперь в 5.6.4),

Я попытался обновить версию lixml2 (сейчас я в 2.8.0, но я уже пытался обновить в 2.9.3)

Я утверждал, что версия libxml, используемая в php, всегда равна 2.8.0, но я не нашел способ изменить это,

Я попытался установить всю директорию symfony в chmod 777

Мой сервер - сервер debian 7.5.

Может кто-то, кто знает эту ошибку, может помочь мне

Вот несколько ссылок на разные вопросы, связанные с этим:

Случайная ошибка, Ошибка FOSUserBundle и Ошибка обслуживания

Я не писал в них, потому что они устарели

[EDIT]

Я нашел быстрое исправление, но это у поставщиков, поэтому оно будет отменено в первом обновлении обновления доктрины:

QuickFix в строке XmlDriver.php 737

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

Ответ 1

Мы получили эту ошибку после того, как начали использовать libxml_disable_entity_loader(true); в нашем коде. Этот код очень важен для предотвращения XXE-битков (подробнее об этом в здесь). Если у вас этого нет в коде, возможно, вы установили/обновили пакет, в котором используется эта строка кода. Обратите внимание, что libxml_disable_entity_loader() не является потокобезопасным, поэтому, если в одном потоке, который выполняет эту строку, есть один фрагмент кода, все на этом сервере теперь активировано на протяжении всего процесса.

FOS-bundle, похоже, использует xml-определения, которые в свою очередь имеют в них внешние сущности. Ничего особенного, но этот код не позволяет методам FOS-bundles правильно использовать эти файлы.

К счастью, наш сервис получил эту ошибку только в одном месте, и исправление было очевидно: Добавьте libxml_disable_entity_loader(false); перед выполнением этого фрагмента кода, в котором возникает ошибка, и добавьте libxml_disable_entity_loader(true); сразу после этого фрагмента кода. Таким образом, пользовательский пакет мог бы загрузить XML файл: s он нужен, но безопасность не была скомпрометирована.

Пример:

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