2012-09-06 31 views
9

Tengo un script php que se ejecuta durante aproximadamente 2 horas. Es un trabajo cron. El trabajo cron se ejecuta cada 4 horas.memory_limit: ¿Cómo funciona?

Al final de la secuencia de comandos, se muestran algunos valores de memoria.

The memory_get_usage() result is 881568 Bytes (0.840766906738M) 
The memory_get_peak_usage() result is 1340304 Bytes (1.27821350098M) 
The memory_get_usage(true) result is 1572864 Bytes (1.5M) 
The memory_get_peak_usage(true) result is 1835008 Bytes (1.75M) 

El memory_limit en php.ini era 128M y no funcionó. Lo elevo a 256M y ahora funciona.

Pero como el pico de memoria de la escritura es inferior a 2 M ....

Entonces, ¿cómo funciona el parámetro memory_limit?

¿Es la memoria total utilizada por el script? Si es así, ¿cómo puedo calcularlo?

¿Es el pico de memoria del script? si es así, ¿lo estoy calculando bien?

Estoy usando php 5.3.16.

EDITAR

no tengo ningún mensaje de error. Cuando el límite era 128M El script se ejecuta, pero nunca termina.

+0

¿Qué más está ejecutando en el mismo servidor? –

+0

Si su script se bloqueó con un error de límite de memoria, ¿cómo vio los mensajes de registro? – galymzhan

+0

@galymzhan No se bloqueó cuando el límite se aumentó a 256 MB, se bloqueó cuando se estableció en 128 MB. Sin embargo, ahora está configurado en 256MB. Marm ve que el uso máximo de memoria no está cerca del límite de 128 MB, su pregunta es ¿por qué necesitaba subir el límite para que funcione? – Lee

Respuesta

4

Intente utilizar una función que utiliza su sistema operativo para informar de la memoria real como esta.

function unix_get_usage() { 
     $pid = getmypid(); 
     exec("ps -o rss -p $pid", $output); 
     return $output[1] *1024; 
} 

function windows_get_usage(){ 
    $output = array(); 
    exec('tasklist /FI "PID eq '.getmypid().'" /FO LIST', $output); 
    return preg_replace('/[^0-9]/', '', $output[5]) * 1024; 
} 

Su script probablemente consume una gran cantidad de memoria que PHP no tiene en cuenta al volver de memory_get_usage() (que mira a la pila por cierto). Las variables asignadas de pila se habrían aclarado cuando se haya llamado y devuelto memory_get_usage().

También debería intentar ejecutar esta función y otras en otros puntos durante la ejecución, p. Ej. después de grandes llamadas MySQL o procesamiento de archivos. memory_get_peak_usage() puede no funcionar en todos los SO, especialmente dependiendo de las opciones de compilación.

+0

Eso tiene sentido, pero ¿no debería ser un problema con 'memory_get_peak_usage()'? No lo creo, pero no estaría de más comprobar el uso de la memoria de una manera diferente a la que sugieres. – Wiseguy

+0

No si ambos (memory_get_peak_usage y memory_get_usage) solo miran en el montón y la mayor parte de su memoria es puramente automática/asigna variables asignadas. –

+0

Y debo llamar a esta función en todos los lugares que creo que uso mucha memoria? ¿Hay una función del sistema para obtener el pico de la pila? Porque no estoy seguro de que mi script use mucha memoria – Marm

Cuestiones relacionadas