simplexml_load_file(): I/O 警告: 无法加载外部实体 “/user-bundle/Resources/config/doctrine/model/User.orm.xml

2022-08-30 21:22:22

我在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中升级)

我已经说过,php中使用的libxml版本始终是2.8.0,但是,我还没有找到改变这一点的方法,

我试图在chmod 777中设置symfony的所有目录

我的服务器是 debian 7.5 服务器。

也许知道这个错误的人可以帮助我

以下是与此相关的不同问题的一些链接:

随机错误FOS用户捆绑包错误和服务错误

我没有在它们中发布,因为它们都过时了

[编辑]

我找到了一个快速修复程序,但它在供应商中,因此它将在学说更新的第一次更新中被覆盖:

XmlDriver 中的 QuickFix.php第 737 行

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

答案 1

在代码中开始使用后,我们得到了这个错误。该代码对于防止XXE攻击至关重要(更多信息请见此处)。如果您的代码中没有,则可能是您已安装/更新了一个正在使用该行代码的捆绑包。请注意,这不是线程安全的,因此,如果一个线程上有一段代码执行该行,则该服务器上的所有内容现在都在整个过程中都启用了该代码。libxml_disable_entity_loader(true);libxml_disable_entity_loader()

FOS 捆绑包似乎使用 xml 定义,作为回报,其中有外部实体。虽然没什么大不了的,但是该代码会阻止FOS捆绑包方法正确使用这些文件。

幸运的是,我们的服务只在一个地方得到了这个错误,修复是显而易见的:在执行错误来源的代码段之前添加一个,然后立即添加到该段代码之后。这样,用户捆绑包就可以加载所需的 xml:s,但安全性不会受到损害。libxml_disable_entity_loader(false);libxml_disable_entity_loader(true);

例:

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

答案 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 > 

请注意,上面的错误与您在问题中提到的错误相同。因此,第一次尝试是在尝试加载文件后使用该函数检查该文件是否真的存在。下一步是检查当前路径 ( using - 和文件的路径是否正确指向该文件。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) "
    "
  }
}

注意:工作正常。因此,您的文件可能不存在或路径不正确。该路径考虑当前路径加号、函数调用中指示的文件,或等于调用该文件。/tmptest.txt/tmp/test.txt


推荐