simplexml_load_file():I/O警告:无法加载外部实体&引用/用户包/Resources/config/doctor/model/user.orm.xml

我对Symfony2的生产部署有一些问题

我尝试过许多解决方案,但没有一个奏效

在生产环境中访问symfony应用程序时,我随机出现以下错误:

(!)致命错误:未捕获异常“Symfony\Component\Debug\exception\ContextErrorException”,并显示消息“警告:simplexml加载文件():I/O警告:加载外部实体失败&引用/home/user/symfony/vendor/friendsofsymfony/user bundle/Resources/config/doctor/model/user.orm.xml&引用在第2998行的/home/user/symfony/app/bootstrap.php.cache中
(!)Symfony\Component\Debug\Exception\ContextErrorException:警告:simplexml_load_file():I/O警告:无法加载外部实体&引用/home/user/symfony/vendor/friendsofsymfony/user bundle/Resources/config/doctor/model/user.orm.xml&引用;在736行的/home/user/symfony/vendor/doctrine/orm/lib/doctrine/orm/Mapping/Driver/XmlDriver.php中
调用堆栈
#时间记忆功能定位
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\ContainerWarehttpKernel->handle()../bootstrap.php.cache:2376
(!)LogicException:第2998行的/home/user/symfony/app/bootstrap.php.cache中的请求堆栈为空
调用堆栈
#时间记忆功能定位
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版本(我在PHP5.4.x中,现在在5.6.4中)

我已经尝试升级lixml2版本(我现在在2.8.0中,但我已经尝试在2.9.3中升级)

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

我试图在chmod777中设置symfony的all目录

我的服务器是Debian7.5服务器

也许知道这个错误的人能帮我

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

随机错误、FOSUserBundle错误和服务错误

我没有把它们贴上去,因为它们都过时了

[编辑]

我找到了一个快速修复方法,但它在供应商中,因此它将在条令更新的第一次更新中被覆盖:

XmlDriver.php第737行中的QuickFix

[email protected]\u load\u file($file);
如果(!$xmlElement){
$xmlData=file\u get\u contents($file);
$xmlement=simplexml\u load\u字符串($xmlData);
}

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

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

幸运的是,我们的服务只在一个地方出现了该错误,修复方法显而易见:
添加libxml\u禁用\u实体\u加载程序(false)</在执行错误产生的代码之前,添加libxml\u disable\u entity\u loader(true)就在那段代码之后。
这样,用户包可以加载所需的xml:s,但安全性不会受到影响

例如:

libxml\u禁用实体\u加载程序(false);
$user=$query-&gt;getOneOrNullResult();//如果禁用实体加载程序,则会生成错误
libxml_禁用实体_加载程序(true);

发表评论