2012-09-06 20 views
9

Mam skrypt php, który działa przez około 2 godziny. To jest praca crona. Zadanie cron działa co 4 godziny.memory_limit: Jak to działa?

Na końcu skryptu wyświetlam niektóre wartości pamięci.

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) 

Limit pamięci w php.ini wynosił 128M i nie zadziałał. Podnoszę go do 256M i teraz działa.

Ale jak szczyt pamięci skryptu jest mniejszy niż 2M ....

Więc jak działa parametr memory_limit?

Czy to całkowita pamięć używana przez skrypt? Jeśli tak, jak mogę to obliczyć?

Czy to szczyt pamięci scenariusza? jeśli tak, czy obliczam to poprawnie?

Używam php 5.3.16.

EDIT

nie mam żadnych komunikatów o błędach. Gdy limit wynosi 128M Skrypt wykonuje, ale nigdy się nie kończy.

+0

co jeszcze działa na tym samym serwerze? –

+0

Jeśli Twój skrypt uległ awarii z błędem limitu pamięci, w jaki sposób zobaczyłeś komunikaty dziennika? – galymzhan

+0

@galymzhan Nie uległo awarii po zwiększeniu limitu do 256 MB, uległo awarii, gdy ustawiono na 128 MB. Jednak teraz jest ustawiony na 256 MB. Widać, że maksymalne wykorzystanie pamięci nie jest w pobliżu limitu 128 MB. Jego pytanie brzmi, dlaczego musiał zwiększyć limit, aby działało? – Lee

Odpowiedz

4

Spróbuj użyć funkcji, która używa systemu operacyjnego do raportowania rzeczywistej pamięci, takiej jak ta.

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

Twój skrypt prawdopodobnie zużywa dużo pamięci, że PHP nie uważa po powrocie z memory_get_usage() (która patrzy na stercie btw). Zmienne przydzielone do stosu zostałyby usunięte w momencie wywołania i zwrócenia funkcji memory_get_usage().

Powinieneś również spróbować uruchomić tę funkcję i inne w innych punktach podczas wykonywania, np. po wielkich połączeniach MySQL lub przetwarzaniu plików. Funkcja memory_get_peak_usage() może nie działać na wszystkich systemach operacyjnych, szczególnie w zależności od opcji kompilacji.

+0

To ma sens, ale czy to nie powinno być problemem z 'memory_get_peak_usage()'? Nie sądzę, ale nie zaszkodzi sprawdzić użycie pamięci w inny sposób, niż sugerujesz. – Wiseguy

+0

Nie, jeśli oba (memory_get_peak_usage i memory_get_usage) wyglądają tylko na stercie, a większość twojej pamięci to czysto automatyczne/przydzielane na stosie zmienne. –

+0

I muszę nazwać tę funkcję w każdym miejscu, w którym używam dużej ilości pamięci? Czy istnieje funkcja systemowa, aby uzyskać maksymalny stack? Ponieważ nie jestem pewien, gdzie mój skrypt używa dużej ilości pamięci – Marm