Nano Hash - криптовалюты, майнинг, программирование

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 и Ошибка службы

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

[РЕДАКТИРОВАТЬ]

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

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

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

  • Помимо того, что вы меняете поставщика, что плохо, добавление @, чтобы скрыть фатальную ошибку, еще хуже, ваш php-скрипт останавливается, и вы даже не осознаете этого, он будет выглядеть нормально без ошибок, но после этого вы заметите какое-то странное поведение без зная почему. 13.03.2015
  • Да, я знаю, что это быстрое исправление не является решением, но это лучше, чем ничего! 14.03.2015

Ответы:


1

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

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

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

Пример:

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

2

Упомянутая ошибка обычно возникает, когда файл xml не существует.

Вы можете попробовать проверить, действительно ли файл существует после попытки загрузки:

if (file_exists($file)) {
    $xmlElement = @simplexml_load_file($file);
}

Я попытался смоделировать ошибку при локальном запуске php в интерактивном режиме, результаты ниже:

php > simplexml_load_file('test.xml');
PHP Warning:  simplexml_load_file(): I/O warning : failed to load external entity "test.xml" in php shell code on line 1
php > 

Обратите внимание, что ошибка выше такая же, как вы упомянули в вопросе. Итак, первая попытка — использовать функцию file_exists(), чтобы проверить, действительно ли файл существует после попытки загрузить его. Следующий шаг — проверить, правильно ли текущий путь — с помощью getcwd() — и путь к файлу указывают на файл.

Я создал файл с именем test.xml в папке /tmp:

 <test>
        <worked>
        </worked>
    </test>

Вызывается интерактивный режим на php:

$ php -a
Interactive mode enabled

Итак, проверил мой локальный каталог:

php > echo getcwd();
/tmp

И попытался загрузить файл:

php > $data = simplexml_load_file('test.xml');
php > var_dump($data);
object(SimpleXMLElement)#1 (1) {
  ["worked"]=>
  object(SimpleXMLElement)#2 (1) {
    [0]=>
    string(2) "
    "
  }
}

Примечание: это сработало правильно. Так что, возможно, вашего файла не существует или указан неверный путь. Путь учитывает текущий путь /tmp плюс файл, указанный при вызове функции test.txt, или равен вызову файла /tmp/test.txt.

26.09.2019

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..