2010-11-03 19 views
13

Actualmente tengo una secuencia de comandos CLI de PHP que usa Zend Framework extensivamente, que parece estar usando una cantidad de memoria cada vez mayor a medida que se ejecuta. Pasa por un gran conjunto de modelos recuperados de una base de datos en lotes de 1000. Las llamadas al memory_get_usage() muestran que el uso de la memoria del script siempre está aumentando.¿Hay alguna manera de obtener el tamaño de una variable de PHP en bytes?

Esto a pesar de estar seguro de que estoy desarmando el modelo después de cada iteración y en realidad usando array_shift() para reducir el tamaño de la matriz de modelos en cada iteración.

Mi pregunta es, ¿en PHP hay alguna manera de descubrir el tamaño en la memoria de una variable para poder seguir lo que está creciendo?

+0

Hay un [duplicado] (http://stackoverflow.com/questions/1075419/how-to-find-memory-used-by-an-object-in-php-sizeof) pero estoy no estoy contento con la respuesta aceptada allí (aunque la solución puede ser la única) así que no vota para cerrar y +1 –

+0

Esta es una pregunta con la que he luchado por un tiempo. Es posible usar xDebug para perfilar una aplicación, pero no dice nada sobre el uso de memoria. En lugar de llamar memory_get_usage en ciertos puntos, nunca encontré una solución. –

+0

Tuve una búsqueda de duplicados, pero todo lo que obtuve fue una página llena de errores de memoria, aunque es una pena. La razón por la que acepté esa respuesta en particular fue porque básicamente confirmó lo que literalmente acabamos de descubrir, no hay forma real de descubrir el tamaño de una variable y, al menos parte de la razón por la que estaba masticando memoria era debido a la mala recolección de basura. Veo su punto, sin embargo. – EntityDigital

Respuesta

3

no tengo una solución para comprobar el tamaño de todas las variables, pero si se utiliza doctrine su probablemente la razón

que necesito utilizar

$Elem->free(true); 

otra cosa es actualizar a 5.3 (si aún no lo hace), el garbage collector de 5.3 es mejor

+0

No usamos doctrina pero la ejecutamos en 5.3 cosas enormemente mejoradas, especialmente al ejecutar gc_collect_cycles() después de cada lote de 1000. Gracias. – EntityDigital

-2

Aquí es un fragmento de código que encontré en weberdev

<?php 
function array_size($a){ 
    $size = 0; 
    while(list($k, $v) = each($a)){ 
     $size += is_array($v) ? array_size($v) : strlen($v); 
    } 
    return $size; 
} 
?> 

Se obtiene el tamaño de la matriz dada en bytes. ¿Es esto lo que querías decir?

+3

Esto devuelve la longitud total de las cadenas dentro de una matriz, no dice nada sobre el tamaño de la matriz en bytes. Si estuviese utilizando un juego de caracteres multibyte, esta función reportaría incorrectamente –

+0

Tiene razón, pero la mayoría de las veces, no usará un conjunto de caracteres multibyte y, dado que se usa para depuración, tal vez pueda ser útil. –

+1

Al mirar la pregunta original, el OP está recuperando un gran conjunto de elementos de modelo, por lo que es probable que sea una matriz de objetos en lugar de cadenas. Esta función podría ser útil en casos cerain, pero no estoy seguro de que sea aplicable aquí. –

3

No. Probablemente esté buscando memoria que no se haya liberado, por ejemplo desenlazó una variable o eliminó una referencia y el garbage collector aún no lanzó el bloque asociado en la memoria.

Podrías probar Zend Server 5 (aunque necesitas la versión comercial) para mem-profile tu aplicación. Tiene code tracing. Sin embargo, no sé si esto te permitiría detectar pérdidas de memoria.

Véase también:

0

no sé cómo es exacta, pero tengo un número utilizando apc_add('variable_name', $var);. Luego voy a mi apc.php debajo de las entradas de caché de usuario y miro la columna de tamaño.

Por supuesto, para que esto funcione, debe tener APC instalado y ejecutándose. :-)

Cuestiones relacionadas