Php 特定于环境的内存泄漏
我在使用Doctrine 2/Symfony的批处理脚本期间遇到内存泄漏问题 首先:我知道如何正确管理实体管理器以避免内存泄漏,出于某种原因,我的live server能够运行以下代码而不会遇到此问题。然而,在我的本地开发环境(PHP5.4.7)上,运行以下命令会导致内存使用膨胀 编辑: 是否有任何PHPINI、apache、osx、mysql验证可能导致此问题,因为我现在完全不知所措 请注意,这两个位置的代码都是相同的——因此造成这种差异的唯一原因是某种我不知道的日志记录(x-debug或SQL的自动日志记录) live server在本地运行PHP 5.4.6和5.4.7 live server正在本地运行centos 6,而不是OSX 我正在prod模式下运行以下命令,调试处于关闭状态Php 特定于环境的内存泄漏,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我在使用Doctrine 2/Symfony的批处理脚本期间遇到内存泄漏问题 首先:我知道如何正确管理实体管理器以避免内存泄漏,出于某种原因,我的live server能够运行以下代码而不会遇到此问题。然而,在我的本地开发环境(PHP5.4.7)上,运行以下命令会导致内存使用膨胀 编辑: 是否有任何PHPINI、apache、osx、mysql验证可能导致此问题,因为我现在完全不知所措 请注意,这两个位置的代码都是相同的——因此造成这种差异的唯一原因是某种我不知道的日志记录(x-debug或SQ
<?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]);
}
}
}
如下所述:
在调试环境中,Symfony记录所有查询。您必须手动设置选项“探查器:false”
如果有帮助,请告诉我。链接页面上也很少有其他建议;您可能需要检查它们。live server上的PHP版本是什么?live=5.4.6。。。。。。如果你说你在本地机器上使用OSX,我会首先假设这是PHP5.4中的一个bug。。但是看看5.4.7中的变更日志,它似乎没有得到解决(至少在bug修复中没有提到内存泄漏),在doctrine2 github页面上发布一个问题可能是一个很好的方法来实现这一点。我已经能够在同事系统上运行代码,并且没有泄漏(他运行的是5.3.10和另一个php.ini). 我有两种系统配置,所以我将使用试错法来确定是哪部分配置导致了问题。我还将在Linux中安装一个VM并在本地运行,以进行尝试。当/如果我发现更多信息,我将报告doctrine用户组。我在doctrine 1.x中使用sql server的PDO时遇到了类似的问题,原来是PHP5.3.6中的一个错误导致了PDO中的内存泄漏,可能是类似的问题导致了此问题。给出的链接是针对doctrine 1的。我没有在调试环境中运行。问题发生在我以生产模式(本地)运行时,而不会发生在我的同事以生产模式(本地)运行相同代码时。我确信这一定是因为php的编译方式(或我的本地配置)。我从来没有弄清楚这一点,所以我只是把我的内存限制设置为10Gb,暂时让它飞起来。
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...
all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=.......'
username: .....
password: .....
profiler: false