У меня есть некоторые проблемы с моим производственным развертыванием 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 а также Сервисная ошибка
Я не писал в них, потому что они все устарели
[РЕДАКТИРОВАТЬ]Я нашел быстрое решение, но оно есть у поставщиков, поэтому оно будет переопределено в первом обновлении доктрины:
QuickFix в XmlDriver.php Строка 737
$xmlElement = @simplexml_load_file($file);
if(!$xmlElement){
$xmlData = file_get_contents($file);
$xmlElement = simplexml_load_string($xmlData);
}
Мы получили эту ошибку после того, как начали использовать libxml_disable_entity_loader(true);
в нашем коде. Этот код имеет жизненно важное значение для предотвращения XXE-атак (более подробную информацию об этом в Вот). Если этого нет в вашем коде, возможно, вы установили / обновили пакет, в котором используется эта строка кода. Обратите внимание, что libxml_disable_entity_loader()
не является потокобезопасным, поэтому, если в одном потоке есть один фрагмент кода, который выполняет эту строку, то все на этом сервере теперь включено на протяжении всего процесса.
Кажется, FOS-пакет использует xml-определения, которые, в свою очередь, содержат внешние сущности. Ничего особенного, но этот код мешает методам FOS-связок правильно использовать эти файлы.
К счастью, наш сервис получил эту ошибку только в одном месте, и исправление было очевидно:
Добавить 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);
Есть несколько решений:
https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1062