2009-07-02 4 views
27

Comment trouver la mémoire utilisée par un objet en PHP? (taille de c). L'objet que je veux découvrir est un dictionnaire avec des chaînes et des entiers, donc il est difficile de le calculer manuellement. Aussi chaîne en php peut être de longueur variable en fonction de l'encodage (utf8 etc) correct?Comment trouver la mémoire utilisée par un objet en PHP? (sizeof)

Répondre

40

Vous pouvez utiliser memory_get_usage().

Exécutez-le une fois avant de créer votre objet, puis de nouveau après la création de votre objet et faites la différence entre les deux résultats.

+2

Une autre façon de le faire en mémoire est de obtenir l'utilisation de la mémoire, cloner l'objet, obtenir la nouvelle utilisation de la mémoire et désactiver le clone. Il y a une empreinte cependant, donc n'abusez pas ... :) –

+0

Je crois le résultat que nous obtenons du 'echo memory_get_usage()' avant et après un tableau, ses unités supposent être dans 'KB' !! ! J'ai divisé la taille de la mémoire par 1024! Pour obtenir la taille de mémoire réelle consommée. – Neocortex

+2

non c'est dans les octets pas kb http://ca3.php.net/memory_get_usage –

-6

Je ne sais pas qu'il existe un moyen simple d'obtenir la taille d'un objet en PHP. Vous pourriez avoir à faire une algorith que

  1. compte les ints
  2. nombre Multiplie de ints par la taille d'un int sur le disque dur
  3. Convertir des caractères dans les chaînes ASCII et
  4. Multiplier les valeurs ASCII par combien ils prennent sur le disque

Je suis sûr qu'il y a un meilleur moyen, mais cela fonctionnerait, même si ce serait une douleur.

+4

C'était fou. ;] –

+14

Vous avez oublié d'attendre le 1er avril pour poster ce compagnon! – NickT

+0

je ne pense pas qu'il était sérieux :) – Stann

10

Pour avoir une idée de la taille des objets, essayez

strlen(serialize($object)); 

Il est pas précis, mais un moyen facile d'obtenir un numéro de comparaison.

+1

Cela pourrait avoir des utilisations, mais pas pour la mémoire. PHP <= 5.2 est profondément inefficace dans la façon dont il stocke certaines structures de mémoire. – danorton

+0

J'utilisais ceci pour vérifier la réponse de json avant de l'envoyer, mais il épuise réellement ma limite de mémoire – clod986

8

Si vous avez besoin de connaître la taille d'un objet ou d'un tableau déjà créé, vous pouvez utiliser le code suivant pour le trouver.

<?php 

function rec_copy($src) { 
    if (is_string($src)) { 
    return str_replace('SOME_NEVER_OCCURING_VALUE_145645645734534523', 'XYZ', $src); 
    } 

    if (is_numeric($src)) { 
    return ($src + 0); 
    } 

    if (is_bool($src)) { 
    return ($src?TRUE:FALSE); 
    } 
    if (is_null($src)) { 
    return NULL; 
    } 

    if (is_object($src)) { 
    $new = (object) array(); 
    foreach ($src as $key => $val) { 
     $new->$key = rec_copy($val); 
    } 
    return $new; 
    } 

    if (!is_array($src)) { 
    print_r(gettype($src) . "\n"); 
    return $src; 
    } 

    $new = array(); 

    foreach ($src as $key => $val) { 
    $new[$key] = rec_copy($val); 
    } 
    return $new; 
} 

$old = memory_get_usage(); 
$dummy = rec_copy($src); 
$mem = memory_get_usage(); 

$size = abs($mem - $old); 
?> 

Cela crée essentiellement une copie de la structure du tableau et tous ses membres.

A ne pas précis à 100%, mais la version de travail est aussi:

<?php 

$old = memory_get_usage(); 
$dummy = unserialize(serialize($src)); 
$mem = memory_get_usage(); 

$size = abs($mem - $old); 

espoir qui aide pour les cas où l'objet est construit déjà.

Questions connexes