web-dev-qa-db-fra.com

Comment trouver la mémoire utilisée par un objet en PHP? (taille de)

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

30
erotsppa

Vous pouvez utiliser memory_get_usage () .

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

45
zombat

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

strlen(serialize($object));

Ce n'est en aucun cas précis, mais c'est un moyen facile d'obtenir un nombre à des fins de comparaison.

12
rekowski

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 découvrir.

<?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.

Une version pas 100% précise, mais toujours fonctionnelle, est également:

<?php

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

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

J'espère que cela aide pour les cas où l'objet est déjà construit.

8
LionsAd