如何在加载Doctrine固定装置时禁用控制台中的查询日志记录?

问题描述 投票:4回答:1

我有一个固定装置,可以加载大量数据,而且每次我都遇到此错误:

严重错误:耗尽的2147483648字节的允许内存大小(尝试分配16777224字节)/var/www/html/platform-cm/vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/DebugStack.php在第65行

[Symfony \ Component \ Debug \ Exception \ OutOfMemoryException]错误:允许的内存大小为2147483648字节已用尽(尝试分配16777224字节)

[经过一番研究后,我发现this帖子,我读到日志记录可能是问题的原因,因为AppKernel在默认情况下将debug设置为true实例化了,然后每次迭代都将SQL命令存储在内存中。

第一次尝试在AppKernel禁用调试的情况下,运行命令为:

doctrine:fixtures:load --no-debug

但是由于同样的错误,我没有得到运气。

第二次尝试是在config_dev.yml处禁用调试,但是不建议这样做,因为我会骑着每条日志,但都没用。

monolog:
    handlers:
        main:
            type:   stream
            path:   "%kernel.logs_dir%/%kernel.environment%.log"
            level:  debug
#        console:
#            type:   console
#            bubble: false
#            verbosity_levels:
#                VERBOSITY_VERBOSE: INFO
#                VERBOSITY_VERY_VERBOSE: DEBUG
#            channels: ["!doctrine"]
#        console_very_verbose:
#            type:   console
#            bubble: false
#            verbosity_levels:
#                VERBOSITY_VERBOSE: NOTICE
#                VERBOSITY_VERY_VERBOSE: NOTICE
#                VERBOSITY_DEBUG: DEBUG
#            channels: ["doctrine"]

所以,这就是我的灯具的外观:

class LoadMsisdn extends AbstractFixture implements OrderedFixtureInterface
{
    public function getOrder()
    {
        return 13;
    }

    public function load(ObjectManager $manager)
    {
        $content = file_get_contents('number.txt');
        $numbers = explode(',', $content);
        shuffle($numbers);

        foreach ($numbers as $key => $number) {
            $msisdn = new Msisdn();
            $msisdn->setMsisdn($number);
            $msisdn->setBlocked((rand(1, 1000) % 10) < 7);
            $msisdn->setOperator($this->getReference('operator-' . rand(45, 47)));

            $this->addReference('msisdn-' . $key, $msisdn);
            $manager->persist($msisdn);
        }

        $manager->flush();
    }
}

如果我需要从EntityManager禁用记录器,如同一帖子的答案所示,该如何处理?

$em->getConnection()->getConfiguration()->setSQLLogger(null);
php symfony doctrine-orm doctrine
1个回答
9
投票
正在传递给load方法的对象管理器是实体管理器的一个实例(Doctrine\Common\Persistence\ObjectManager只是实体/文档/等管理器实现的接口。
© www.soinside.com 2019 - 2024. All rights reserved.