【问题标题】:Environment Specific Memory Leak环境特定的内存泄漏
【发布时间】:2012-10-03 11:37:28
【问题描述】:

我在使用 Doctrine 2 /Symfony 的批处理脚本期间遇到了内存泄漏问题。

首先:我知道如何正确管理实体管理器以避免内存泄漏,并且由于某种原因,我的实时服务器能够运行以下代码而不会遇到此问题。但是在我的本地开发环境 (PHP 5.4.7) 上运行以下命令会导致我的内存使用膨胀。

编辑:

是否有任何可能导致此问题的 php ini、apache、osx、mysql 配置,因为我现在完全不知所措。

请注意,这两个位置的代码是相同的 - 所以导致这种差异的唯一原因是我不知道的某种日志记录(x-debug 或 SQL 的自动日志记录)。

实时服务器在本地运行 PHP 5.4.6 vs 5.4.7 实时服务器在本地运行 centos 6,与 OSX 相比

我在 prod 模式下运行以下命令并关闭调试...

<?php

namespace Vendor\Bundle\MemoryTestBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class MemTestCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('mem:test')
            ->setDescription('Shows memory use ballooning out of control');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $em = $this->getContainer()->get('doctrine.orm.entity_manager');

        $q = $em->createQuery('SELECT s FROM VendorMemoryTestBundle:SimpleEntity s');
        $iterableResult = $q->iterate();

        $i = 0;

        while (($row = $iterableResult->next()) !== false) {
            $i++;
            if ($i%50 == 0){
                echo sprintf('Memory usage: %01.0fKB.', memory_get_usage(true) / 1024) . PHP_EOL;
                $em->clear();
            }
            $em->detach($row[0]);
        }
    }
}

输出

Memory usage: 72192KB.
Memory usage: 72448KB.
Memory usage: 72448KB.
Memory usage: 72704KB.
Memory usage: 73216KB.
Memory usage: 73472KB.
Memory usage: 73472KB.
Memory usage: 73728KB.
Memory usage: 73728KB.
Memory usage: 73984KB.
Memory usage: 73984KB.
Memory usage: 74240KB.
etc...

【问题讨论】:

  • 直播服务器上的PHP版本是多少?
  • live = 5.4.6 ...... 会更新帖子
  • 有趣的是你说你在本地机器上使用 OSX,我首先假设它是 PHP 5.4 中的一个错误.. 但是查看更新日志似乎并没有已在 5.4.7 中解决(至少在错误修复中没有提到内存泄漏),在教义 2 github 页面上发布问题可能是提出此问题的好地方
  • 我已经能够在同事系统上运行代码并且那里没有泄漏(他正在运行 5.3.10 和不同的 php.ini)。我有两个系统配置,所以我将使用反复试验来确定我的配置的哪一部分导致了问题。我还将在 Linux 中启动并在本地运行 VM 以进行尝试。当/如果我发现更多信息时,我会报告教义用户组。
  • 我在使用 PDO 和 sql server 的教义 1.x 中遇到了类似的问题,原来这是 PHP 5.3.6 中的一个错误,它导致 PDO 中的内存泄漏,可能是一个类似的问题导致这个

标签: php symfony doctrine-orm


【解决方案1】:

如此处所述: php/symfony/doctrine memory leak?

在调试环境中,Symfony 记录所有查询。您必须手动设置选项“profiler:false”。

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=.......'
      username: .....
      password: .....
      profiler: false

如果有帮助,请告诉我。链接页面上也几乎没有其他建议;您可能需要检查它们。

【讨论】:

  • 给出的链接是针对 Doctrine 1 的。我没有在调试环境中运行。当我在生产模式(本地)下运行时会发生此问题,而当我的同事在生产模式下(本地)运行相同的代码时不会发生此问题。我确定它必须取决于 php 的编译方式(或我的本地配置)。我从来没有深究,所以我只是将我的内存限制设置为 10Gb,暂时让它飞起来。
猜你喜欢
  • 2013-10-27
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多