【问题标题】:Out of memory error in symfonysymfony内存不足错误
【发布时间】:2015-07-25 14:45:57
【问题描述】:

我目前正在开发 Symfony 项目 (const VERSION ='2.5.10'),我正在使用 xampp。 PHP版本是5.5.19。

我的问题是每次运行我的开发环境时都会出错:

OutOfMemoryException: 错误: C:\xampp\htdocs\Editracker\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Profiler\FileProfilerStorage.php 中允许的内存大小为 1073741824 字节已用尽(尝试分配 3358976 字节)第 153 行

每次我刷新页面时,它都会给出不同的内存大小。我也认为这也是我的开发环境需要很长时间才能刷新页面的原因。

感谢您的帮助。

php.ini

memory_limit='256M'

我试图增加我的内存限制,但它仍然给出关于内存限制的错误

【问题讨论】:

  • 错误信息非常明显。您的代码占用了太多 RAM,您需要找出导致 OOM 的部分。
  • @Michael:我已经尝试过了,但它仍然给我一个关于内存限制的错误。我该怎么办?
  • 找到您尝试通过 ORM 一次检索数千行的位置,并修复它。
  • 我们不知道你有多少内存,你有什么代码。这个问题太宽泛了。您需要使用 xdebugblackfire 分析您的代码,以找到超出所有内存的位置。

标签: php symfony out-of-memory


【解决方案1】:

Symfony 中最急切的组件是分析器。如果您在某些特定操作中不需要分析器,您可以通过代码禁用它:

if ($this->container->has('profiler'))
{
    $this->container->get('profiler')->disable();
}

你也可以在config中设置全局参数:

framework:
    profiler:
        collect: false

【讨论】:

  • 我应该在哪里设置它?是在 config.yml 中还是在 config_dev.yml 中?对不起,我真的很困惑。
  • 您的 config.dev 导入 config.yml。所以一切都一样。但我建议你将它放在你的 dev-config 中。
  • 我试了一下,我得到一个错误:“[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException] “框架”下的无法识别的选项“收集”
  • 您忘记将分析器放在框架和收​​集之间的中间。我认为凭借您的技能,您应该为您的项目选择另一个框架(或者可能是 CMS)。 Symfony 对您来说非常复杂。
  • 我按照你的例子,那么可能是什么问题?关于更改我正在使用的框架,我不能,因为我只是固有这个项目并且需要增强它的功能。我刚刚开始学习这个框架。
【解决方案2】:

您要么禁用 symfony 分析器(据我所知,我认为这不是您想要的),要么在 php.ini 中使用 -1 将限制设置为无限制并重新启动 apache。

memory_limit = -1

【讨论】:

  • 我尝试让内存不足错误消失,但用这个替换“FatalErrorException:错误:C:\xampp\htdocs\Editracker\vendor\symfony\symfony 中超过 30 秒的最大执行时间\src\Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector.php 第 101 行“
  • 也试试这个:max_execution_time = 0
  • 如果它不能解决它,那么您最好尝试在您的应用程序中找到实际的瓶颈。你可能有更大的问题。
  • 也许,我真的需要。无论如何,我试图打开探查器,我发现查询一直在重复。坚果那么我该如何解决呢?我只是继承了这个项目。
【解决方案3】:

我通过安装 XDebug 解决了 Twig 调试中的内存不足错误。

因为 Twig 在内部使用 PHP var_dump 函数,所以安装 XDebug 是个好主意,因为它将数组和对象的 var_dump() 输出限制为 3 级深度,正如我们在 documentation 上看到的那样。

感谢@peezi

【讨论】:

    【解决方案4】:

    如果仅在 Symfony 开发环境下达到内存限制,我建议将以下内容添加到 web/app_dev.php

    ini_set('memory_limit', '-1');
    

    通过这种方式,您可以使用合理的内存量继续测试生产。通过 php.ini 修改整个环境可能会隐藏错误。

    【讨论】:

    • 真的是无限sensible amount of memory
    • 在不了解系统及其内存需求的情况下,这是一个比在 php.ini 中设置内存限制更好的地方。在 app_dev 中更改它只会影响 dev 版本代码的运行,将其放在 php.ini 中意味着主机上的所有项目都受制于无限内存。在测试项目的实时版本时,您不要忘记将 php.ini 改回来。
    【解决方案5】:

    即使迟到了,最近我也遇到了关于Out of Memory 的问题,只是用 Symfony 3.4 访问 app.php 文件。原来,当你把SELinux设置为enforcing时,即使你将项目内var目录的权限设置为777,它也无法在上面写。如果您按照官方文档中关于如何在生产中部署的步骤进行操作,它将返回响应代码 500 并在 Web 服务器的错误日志中仅写入 PHP 已耗尽内存限制。

    我不是 SELinux 专家,但我可以解决此问题的唯一方法是禁用 SELinux,但版本 /etc/selinux/config 文件设置 SELINUX=disabled 并重新启动操作系统。

    同样,SELinux 存在是有原因的,使用 Symfony 的 var 子文件夹不容易找到正确的配置,并且如果不考虑禁用 SELinux 就很难解决这个问题。

    【讨论】:

      【解决方案6】:

      这可能会有所帮助:

      php -d memory_limit=-1 /usr/local/bin/composer require ggergo/sqlindexhintbundle 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        相关资源
        最近更新 更多