2012-09-06 2 views
9

나는 약 2 시간 동안 실행되는 PHP 스크립트를 가지고있다. 그것은 cron 직업입니다. cron 작업은 4 시간마다 실행됩니다.memory_limit : 어떻게 작동합니까?

스크립트 끝 부분에서 몇 가지 메모리 값을 표시합니다.

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) 

php.ini의 memory_limit는 128M이며 작동하지 않았습니다. 나는 그것을 256M로 올리고 이제는 작동한다.

그러나 스크립트의 메모리 피크가 2M 미만으로 ....

그래서 memory_limit를 매개 변수 작업을 수행하는 방법?

스크립트에서 사용하는 전체 메모리입니까? 그렇다면 어떻게 계산할 수 있습니까?

스크립트의 메모리 절정입니까? 그렇다면, 나는 그것을 올바르게 계산하고 있는가?

저는 5.3.16을 사용하고 있습니다.

내가 어떤 오류 메시지가없는

편집 할 수 있습니다. 제한이 128M 일 때 스크립트가 실행되지만 끝나지 않습니다.

+0

그 밖의 동일한 서버에서 실행중인 것은 무엇입니까? –

+0

스크립트가 메모리 제한 오류와 충돌 한 경우 로그 메시지를 어떻게 보았습니까? – galymzhan

+0

@galymzhan 한계가 256MB로 올라 갔을 때 충돌이 발생하지 않았고, 128MB로 설정되었을 때 충돌이 발생했습니다. 그러나 지금은 256MB로 설정되어 있습니다. Marm은 최대 메모리 사용량이 128MB 제한 근처에있는 것을 보지 않습니다. 그의 질문은 왜 그렇게 작동하도록 한계를 높여야합니까? – Lee

답변

4

운영 체제를 사용하여이 메모리와 같은 실제 메모리를보고하는 기능을 사용해보십시오.

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

스크립트가 아마 memory_get_usage에서 반환 할 때 PHP는 고려하지 않는 메모리를 많이 소비() (BTW 힙에 보이는). 할당 된 스택은 memory_get_usage()가 호출되어 반환 될 때까지 지워졌을 것입니다.

실행 중에 다른 지점에서이 기능과 다른 기능을 실행 해보십시오. 큰 MySQL 호출 또는 파일 처리 후에. memory_get_peak_usage()는 모든 OS에서 작동하지 않을 수 있습니다. 특히 컴파일 옵션에 따라 다릅니다.

+0

그게 합리적이지만,'memory_get_peak_usage()'에 문제가되지 않아야합니까? 그렇게 생각하지는 않지만, 메모리 사용량을 다른 방법으로 확인하는 것이 좋습니다. – Wiseguy

+0

둘 다 (memory_get_peak_usage 및 memory_get_usage) 힙만 보이고 대부분의 메모리는 순전히 자동/스택 할당 변수입니다. –

+0

그리고 나는이 기능을 모든 장소에서 호출해야한다. 나는 많은 메모리를 사용한다. 스택 피크를 얻는 시스템 기능이 있습니까? 왜냐하면 내 스크립트가 많은 메모리를 사용하는 곳이 어디인지 모르니까 – Marm

관련 문제