Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-03-2011 10:36:48

BDS023
Nouveau membre
Date d'inscription: 21-03-2011
Messages: 1

[Zend_Db_Table] Fuites mémoire

Bonjour,

Utilisant ZF pour des longs scripts d'intégration de données en base, je rencontre des comportements de "fuites mémoire" avec Zend_Db_Table et Zend_Db_Table_Row.

Le script ci-dessous démontre que la mémoire consommée à l'appel de ces classes n'est jamais libérée :

Code:

<?php

set_include_path(implode(PATH_SEPARATOR, array(
    realpath('D:/Dev/Lib/ZendFramework-1.9.5/library'),
    get_include_path(),
)));

require_once('Zend/Registry.php');
require_once('Zend/Db/Adapter/Pdo/Mysql.php');
require_once('Zend/Db/Table.php');

$db = new Zend_Db_Adapter_Pdo_Mysql(array(
    'host'     => '127.0.0.1',
    'username' => 'root',
    'password' => 'root',
    'dbname'   => 'dbtest'
    ));
Zend_Db_Table::setDefaultAdapter($db);

class test 
{
  private $_table = null;

  public function __construct()
  {
    $this->_table = new Zend_Db_Table('account');
  }
  
  public function getRow()
  {
    $select = $this->_table->select()
                           ->from($this->_table->info('name'))
                           ->where("acc_id = ?", '0');

    return $this->_table->fetchRow($select);
  }
}

# Fonction de test pour N instances de la classe "test"
# et N appels à la méthode getRow()
function run1($i) 
{
  $list = array();
  
  for ($j=0;$j<=$i;$j++) {
    $test = new test();
    $row = $test->getRow();
    $list[] = $test;
  }
}

# Fonction de test pour 1 instance de la classe "test"
# et N appels à la méthode getRow()
$test = new test();

function run2($i) 
{
  $list = array();
  global $test;
  
  for ($j=0;$j<=$i;$j++) {
    $row = $test->getRow();
    $list[] = $test;
  }
}

$start = memory_get_usage(true);
echo "[START] memory : " . round(($start)/1024,2) . " ko<br />";

run1(10000);
//run2(10000);

$end = memory_get_usage(true);
echo "[END] memory : " . round(($end)/1024,2) . " ko<br />";

echo "[DIFF] " . round(($end-$start)/1024,2) . " ko<br />";

echo "[PIC] " . round(memory_get_peak_usage(true)/1024,2) . " ko<br />";

Avec run1(1000)  soit
1000 instances Zend_Db_Table
1000 instances Zend_Db_Table_Row

[START] memory : 2048 ko
[END] memory : 5632 ko
[DIFF] 3584 ko
[PIC] 16896 ko

Avec run1(10000)  soit
10000 instances Zend_Db_Table
10000 instances Zend_Db_Table_Row

[START] memory : 2048 ko
[END] memory : 10752 ko
[DIFF] 8704 ko
[PIC] 151040 ko

Avec run2(1000) soit
1 instances Zend_Db_Table
1000 instances Zend_Db_Table_Row

[START] memory : 2048 ko
[END] memory : 2048 ko
[DIFF] 0 ko
[PIC] 2048 ko

Avec run2(10000) soit
1 instances Zend_Db_Table
10000 instances Zend_Db_Table_Row

[START] memory : 2048 ko
[END] memory : 2560 ko
[DIFF] 512 ko
[PIC] 2816 ko

Avec ces résultats, on remarque le problème se situe surtout au niveau des instances Zend_Db_Table.
Mais surtout la différence de mémoire après l'éxécution de la méthode runX() devraient être égales à 0 car la mémoire consommée doit être libérée. Il y a donc des comportements de fuites mémoires que j'aimerai comprendre.

Quelqu'un aurait t'il une explication et une méthode pour corriger cette fuite ?

Merci par avance.
Kevin

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages