Symfony + Doktrin PHP ile bellek sızıntısı

4 Cevap php

Bazı siteleri tarar bir örümcek oluşturmak için (benim ORM olarak Doctrine ile) Symfony çerçeve ile PHP kullanıyorum.

Benim sorunum aşağıdaki kod, bir bellek sızıntısı oluşturur:

$q = $this -> createQuery('Product p');

if($store) {
    $q
        -> andWhere('p.store_id = ?', $store -> getId())
        -> limit(1);
}

$q -> andWhere('p.name = ?', $name);

$data = $q -> execute();
$q -> free(true);
$data -> free(true);
return NULL;

Bu kod Doctrine_Table bir alt yerleştirilir. Ben kısmını yürütmek (ve tabii $data -> free(true)) kaçak durur açıklama. Bu Doctrine_Collection bu sızıntısına neden olan bu sonuca götürdü etti.

4 Cevap

Bunu deneyin vermedi, and unseting veri kurtararak Doktrin bellek sızıntıları ile benim problem çözüldü?

// ...
$data->free(true) ;
unset($data) ;
// ...

PHP hangi sürümü kullanıyorsunuz? O 'recursive references leak memory' hata ile ilgisi yoktur.

Ayrıca bağlantıyı temizlemek ve kimlik haritası girdileri kaldırmak gerektiğini, hangi Doctrine_Manager::connection()->clear() aramak için deneyebilirsiniz

Yerine andwhere arasında addWhere kullanıyor olmalıdır? Ayrıca ben denemek, bir sınır, bir ifadenin sonuna eklenir gerektiğine inanıyoruz:

$q = $this -> createQuery('Product p') -> where('p.name = ?', $name);

 if($store) {
$q
    -> addWhere('p.store_id = ?', $store -> getId())
    -> limit(1);
 }

 $data = $q -> execute();
 $q -> free(true);
 $data -> free(true);
return NULL;

Ben sadece sürekli çalışan bir CLI komutu ile aynı sorun haline çalıştırıyorum. Bu sorunu gidermek için kaç saat geçirdikten sonra prod modu benim komutları çalıştırma aslında sorunu çözüldü çıkıyor:

app/console my:custom:command --env=prod