php/symfony/doctrine内存泄漏?

And*_*ier 16 php memory-leaks doctrine symfony1

我使用symfony 1.4和doctrine 1.2将对象批量插入数据库时​​出现问题.

我的模型有一种称为"扇区"的对象,每个对象都有几个"Cupo"类型的对象(通常范围从50到200000).这些物体非常小; 只是一个短标识符字符串和一个或两个整数.每当用户创建一组扇区时,我需要自动将所有这些"Cupo"实例添加到数据库中.如果出现任何问题,我正在使用一个学说交易来回滚所有内容.问题是我只能在php耗尽内存之前创建大约2000个实例.它目前有128MB的限制,应该足以处理使用少于100个字节的对象.我已经尝试将内存限制增加到512MB,但是php仍然崩溃,但这并没有解决问题.

这是错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in /Users/yo/Sites/grifoo/lib/vendor/symfony/lib/log/sfVarLogger.class.php on line 170
Run Code Online (Sandbox Code Playgroud)

这是代码:

public function save($conn=null){

    $conn=$conn?$conn:Doctrine_Manager::connection();

    $conn->beginTransaction();


    try {
        $evento=$this->object;


        foreach($evento->getSectores() as $s){

            for($j=0;$j<$s->getCapacity();$j++){

                $cupo=new Cupo();
                $cupo->setActivo($s->getActivo());
                $cupo->setEventoId($s->getEventoId());
                $cupo->setNombre($j);
                $cupo->setSector($s);

                $cupo->save();

            }
        }

        $conn->commit();
        return;
    }
    catch (Exception $e) {
        $conn->rollback();
        throw $e;
    }
Run Code Online (Sandbox Code Playgroud)

再一次,这个代码适用于少于1000个对象,但任何大于1500的代码都会失败.谢谢您的帮助.

Jor*_*ein 34

试过做

$cupo->save();
$cupo->free();
$cupo = null;
Run Code Online (Sandbox Code Playgroud)

(但代替我的代码)我仍然得到内存溢出.还有其他想法吗?

更新:

我在databases.yml中创建了一个新环境,它看起来像:

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=.......'
      username: .....
      password: .....
      profiler: false
Run Code Online (Sandbox Code Playgroud)

探查:假的条目可以禁用主义的查询记录,通常保持你的每查询的副本.它并没有阻止内存泄漏,但是通过我的数据导入,我能够获得大约两倍的内存泄漏.

更新2

我补充道

Doctrine_Manager::connection()->setAttribute(Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true ); 
Run Code Online (Sandbox Code Playgroud)

在运行我的查询之前,并更改了

$cupo = null;
Run Code Online (Sandbox Code Playgroud)

unset($cupo);
Run Code Online (Sandbox Code Playgroud)

而现在,我的剧本一直快乐地流着.我很确定它会在没有耗尽RAM的情况下完成.

更新3

对.这是获胜的组合.


DrD*_*Dol 1

unset($cupo);每次保存后尝试。这应该有帮助。另一件事是拆分脚本并进行一些批处理。