2012-09-06 15 views
9

Ho uno script php che viene eseguito per circa 2 ore. È un lavoro cron. Il cron job viene eseguito ogni 4 ore.memory_limit: come funziona?

Alla fine dello script, visualizzo alcuni valori di 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) 

Il memory_limit in php.ini era 128 M e non ha funzionato. Lo alzo a 256M e ora funziona.

Ma, come la memoria di picco dello script è inferiore a 2M ....

Quindi, come funziona il parametro memory_limit?

È la memoria totale utilizzata dallo script? Se sì, come posso calcolarlo?

È il picco di memoria della sceneggiatura? se sì, sto calcolando giusto?

Sto usando php 5.3.16.

EDIT

Non ho alcun messaggio di errore. Quando il limite era 128M Lo script viene eseguito, ma non finisce mai.

+0

cos'altro si sta eseguendo sullo stesso server? –

+0

Se il tuo script si è bloccato con un errore di limite di memoria, come hai visto i messaggi di log? – galymzhan

+0

@galymzhan Non si è arrestato in modo anomalo quando il limite è stato aumentato a 256 MB, si è arrestato in modo anomalo quando era impostato su 128 MB. Tuttavia ora è impostato su 256 MB Marm see che l'utilizzo di memoria di picco non è vicino al limite di 128 MB, la sua domanda è: perché ha bisogno di aumentare i limiti per farlo funzionare? – Lee

risposta

4

Provare a utilizzare una funzione che utilizza il sistema operativo per segnalare la memoria effettiva come questa.

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; 
} 

Lo script probabilmente consuma molta memoria che PHP non considera al ritorno dalla memory_get_usage() (che guarda il mucchio btw). Le variabili allocate nello stack sarebbero state azzerate dal momento in cui memory_get_usage() è stato chiamato e restituito.

Si dovrebbe anche provare a eseguire questa funzione e altri in altri punti durante l'esecuzione, ad es. dopo grandi chiamate MySQL o elaborazione di file. memory_get_peak_usage() potrebbe non funzionare su tutti i sistemi operativi, soprattutto a seconda delle opzioni di compilazione.

+0

Questo ha senso, ma non dovrebbe essere un problema con 'memory_get_peak_usage()'? Non lo penserei, ma non sarebbe male controllare l'utilizzo della memoria in un modo diverso come suggerisci. – Wiseguy

+0

Non se entrambi (memory_get_peak_usage e memory_get_usage) guardano solo sull'heap e la maggior parte della memoria è puramente automatica/impila le variabili allocate. –

+0

E devo chiamare questa funzione in ogni punto in cui uso molta memoria? Esiste una funzione di sistema per ottenere lo stack massimo? Perché non sono sicuro di dove il mio script usi molta memoria – Marm