web-dev-qa-db-fra.com

Obtenir la taille en mémoire d'un objet dans PHP?

Il y a un moyen d'obtenir la mémoire totale PHP utilise-t-il (memory_get_usage()) Mais comment obtenir la taille en mémoire d'un objet individuel?

Je ne parle évidemment pas de count() Comme je souhaite le nombre d'octets dans une structure de données potentiellement complexe.

29
Artem Russakovskii

Vous pouvez appeler Memory_Get_Usage () avant et après l'affectation de votre classe comme illustré dans cet exemple d'IBM . Vous pouvez même créer une enveloppe pour le faire, éventuellement stocker le résultat sur une variable de membre de la classe complexe elle-même.

ÉDITER:

Pour clarifier la partie sur le stockage de la taille de la mémoire allouée, vous pouvez faire quelque chose comme ceci:

class MyBigClass
{
    var $allocatedSize;
    var $allMyOtherStuff;
}

function AllocateMyBigClass()
{
    $before = memory_get_usage();
    $ret = new MyBigClass;
    $after = memory_get_usage();
    $ret->allocatedSize = ($after - $before);

    return $ret;
}

À tout moment à l'avenir, vous pouvez vérifier l'allocalisation pour voir la taille de cet objet au moment de l'attribution. Si vous l'ajoutez après l'affectation, l'allocalisation ne serait plus exacte.

17
Eric J.

N'aurait-il pas de sens d'essayer de sérialiser l'objet et de lire la longueur de la chaîne? Évidemment, ce sera de plusieurs octets parce que String Serialized aurait S: "String" par conséquent: '' Etre supplémentaire d'octets ... Sauf si Serialize ne pouvait être la même chose que PHP stocke des objets ?? ?

donc, par exemple

$size = strlen(serialize($object));

Juste une pensée?

Une autre pensée désordonnée mais éventuellement précise:

En supposant une variable d'instance de classe qui a été manipulée plusieurs fois depuis l'instanciation:

$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);

$ mem pourrait être la quantité exacte de mémoire allouée à $ dB;

12
Prof83

Je ne pense pas que cela soit tout à fait possible; Je n'ai jamais rien vu qui vous permettrait d'obtenir la taille d'un objet en mémoire.

Une solution pour obtenir une idée assez approximative pourrait être une sorte de sérialiser vos données et d'utiliser SHLEN à ce sujet ... mais ce sera vraiment quelque chose d'une estimation ... Je ne voudrais pas trop fier à cela, en fait. ..


Même debug_zval_dump Ne fais pas cela: il saisut les données dans une variable et le refcount, mais pas la mémoire utilisée:

$obj = new stdClass();
$obj->a = 152;
$obj->b = 'test';

echo '<pre>';
debug_zval_dump($obj);
echo '</pre>';

ne vous obtiendra que:

object(stdClass)#1 (2) refcount(2){
  ["a"]=>
  long(152) refcount(1)
  ["b"]=>
  string(4) "test" refcount(1)
}
3
Pascal MARTIN

Depuis clone (de Réponse de la PROF8 ) n'a pas fonctionné pour moi, j'ai essayé de sérialiser et de désexeriser la variable dont la taille i vouloir mesurer:

function getMemoryUsage($var) {
    $mem = memory_get_usage();
    $tmp = unserialize(serialize($var));
    // Return the unserialized memory usage
    return memory_get_usage() - $mem;
}

Je pense que cela signale de meilleurs résultats, du moins pour moi.

1
Iván Pérez