2009-07-02 15 views

Respuesta

40

Puede usar memory_get_usage().

Ejecútelo una vez antes de crear su objeto, luego otra vez después de crear su objeto, y tome la diferencia entre los dos resultados.

+2

Otra forma de hacerlo mientras estás en la memoria es obtener el uso de la memoria, clonar el objeto, obtener el nuevo uso de la memoria y desarmar el clon. Sin embargo, hay una huella, así que no abuse ... :) –

+0

Creo que el resultado que estamos obteniendo del 'echo memory_get_usage()' antes y después de una matriz, ¡sus unidades se supone que están en 'KB' !! ! ¡Dividí el tamaño de la memoria por 1024! Para obtener el tamaño real de la memoria consumida. – Neocortex

+2

no, está en bytes no kb http://ca3.php.net/memory_get_usage –

-6

No sé si hay una manera simple de obtener el tamaño de un objeto en PHP. Es posible que sólo tenga que hacer un algorith que

  1. cuenta los enteros
  2. número Multiplica de enteros de tamaño de un int en el disco duro
  3. convertir caracteres en cadenas a ASCII y
  4. Multiplicar los valores ASCII por cuánto ocupan en el disco

Estoy seguro de que hay una manera mejor, pero esto funcionaría, aunque sería un dolor.

+4

Eso fue una locura. ;] –

+14

¡Olvidaste esperar el 1 de abril para publicar este compañero! – NickT

+0

no creo que hablara en serio :) – Stann

10

para tener una idea del tamaño de objetos, tratan

strlen(serialize($object)); 

Es de ninguna manera exacta, sino una manera fácil de obtener un número para la comparación.

+1

Eso podría tener algunos usos, pero no para la memoria. PHP <= 5.2 es profundamente ineficiente en la forma en que almacena algunas estructuras de memoria. – danorton

+0

Estaba usando esto para verificar la respuesta json antes de enviarla, pero en realidad agota mi límite de memoria – clod986

8

Si necesita saber el tamaño de un objeto o matriz ya creado, puede usar el siguiente código para encontrarlo.

<?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); 
?> 

Esto crea esencialmente una copia de la estructura matriz y todos sus miembros.

A, pero es todavía una versión de trabajo no es fiable al 100% también:

<?php 

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

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

Espero que ayude a los casos en que el objeto ya está construido.

Cuestiones relacionadas