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

Posted

技术标签:

【中文标题】simplexml_load_file():I/O 警告:未能加载外部实体“/user-bundle/Resources/config/doctrine/model/User.orm.xml【英文标题】:simplexml_load_file(): I/O warning : failed to load external entity "/user-bundle/Resources/config/doctrine/model/User.orm.xml 【发布时间】:2015-03-22 08:11:58 【问题描述】:

我的 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 服务器。

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

这里是一些与此相关的不同问题的链接:

Random Error、FOSUserBundle Error 和 Service error

我没有在其中发帖,因为它们都已经过时了

[编辑]

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

XmlDriver.php 第 737 行中的 QuickFix

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

【问题讨论】:

除了你改变了不好的供应商这一事实之外,添加一个@来隐藏一个致命错误更糟糕,你的 php 脚本停止并且你甚至没有意识到它,它看起来没有错误但你之后会在不知道为什么的情况下注意到一些奇怪的行为。 是的,我知道这个 quickfix 不是解决方案,但总比没有好! 【参考方案1】:

给出了一些解决方案:

https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1062

https://github.com/symfony/symfony/issues/7291

【讨论】:

【参考方案2】:

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

FOS-bundle 似乎使用 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);

【讨论】:

【参考方案3】:

上述错误通常发生在 xml 文件不存在时。

你可以尝试加载后检查文件是否真的存在:

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

我尝试模拟本地交互运行php的错误,结果在down:

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())和文件路径是否正确指向文件。

我在/tmp 文件夹上创建了一个名为test.xml 的文件:

 <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文件。

【讨论】:

以上是关于simplexml_load_file():I/O 警告:未能加载外部实体“/user-bundle/Resources/config/doctrine/model/User.orm.xml的主要内容,如果未能解决你的问题,请参考以下文章

XAmpp 上的 Joomla 安装失败

想要使用 cURL 而不是 SimpleXML_load_file()

当我尝试做 simplexml_load_file 时出现 XML 错误

simplexml_load_file 抑制警告的直接输出

调用未定义的函数 simplexml_load_file()

XML - simplexml_load_file - foreach