수색…
XHProf로 프로파일 링
XHProf 는 XDebug에 대한 좀 더 가벼운 대안을 제공하기 위해 원래 Facebook에 의해 작성된 PHP 프로파일 러입니다.
xhprof
PHP 모듈을 설치 한 후 PHP 코드에서 프로파일 링을 활성화 / 비활성화 할 수 있습니다.
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
반환 된 배열에는 호출 수, CPU 시간 및 doSlowOperation()
내에서 액세스 된 각 함수의 메모리 사용량에 대한 데이터가 포함됩니다.
xhprof_sample_enable()
/ xhprof_sample_disable()
은 좀 더 가벼운 옵션으로 사용될 수 있습니다.이 옵션은 소수의 요청에 대해서만 (그리고 다른 형식으로) 프로파일 링 정보를 기록합니다.
XHProf에는 데이터를 표시하는 (대부분 문서화되지 않은) 헬퍼 함수가 있거나 ( 예를 참조하십시오 ) 다른 도구를 사용하여 시각화 할 수 있습니다 (platform.sh 블로그 에 예제가 있음 ).
메모리 사용
PHP의 런타임 메모리 제한은 INI 지시문 memory_limit
통해 설정됩니다. 이 설정은 PHP를 한 번만 실행하면 너무 많은 메모리를 사용하지 못하도록하여 다른 스크립트 및 시스템 소프트웨어를 사용하지 않도록합니다. 메모리 제한은 기본적으로 128M이며 php.ini
파일이나 런타임에 변경할 수 있습니다. 제한이 없도록 설정할 수 있지만 일반적으로 나쁜 습관으로 간주됩니다.
런타임 동안 사용 된 정확한 메모리 사용은 memory_get_usage()
를 호출하여 확인할 수 있습니다. 현재 실행중인 스크립트에 할당 된 메모리의 바이트 수를 반환합니다. PHP 5.2에서, PHP가 적극적으로 사용하고있는 메모리와는 대조적으로 할당 된 총 시스템 메모리를 얻기 위해 하나의 선택적인 부울 매개 변수가 있습니다.
<?php
echo memory_get_usage() . "\n";
// Outputs 350688 (or similar, depending on system and PHP version)
// Let's use up some RAM
$array = array_fill(0, 1000, 'abc');
echo memory_get_usage() . "\n";
// Outputs 387704
// Remove the array from memory
unset($array);
echo memory_get_usage() . "\n";
// Outputs 350784
이제 memory_get_usage
는 메모리 사용량을 보여줍니다. 이 함수를 호출 할 때 다른 것들을 메모리에 할당하거나 할당 해제 할 수 있습니다. 특정 포인트까지 사용 된 메모리의 최대량을 얻으려면 memory_get_peak_usage()
호출 memory_get_peak_usage()
.
<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776
값이 올라가거나 일정하게 유지됩니다.
Xdebug로 프로파일 링하기
Xdebug라는 PHP 확장은 PHP 응용 프로그램의 프로파일 링 과 런타임 디버깅을 지원합니다. 프로파일 러를 실행할 때 출력은 "cachegrind"라는 이진 형식의 파일에 기록됩니다. 이 파일을 분석하기 위해 각 플랫폼에서 응용 프로그램을 사용할 수 있습니다.
프로파일 링을 사용하려면 확장을 설치하고 php.ini 설정을 조정하십시오. 이 예에서는 요청 매개 변수에 따라 선택적으로 프로필을 실행합니다. 이렇게하면 설정을 정적으로 유지하고 필요할 때만 프로파일 러를 켤 수 있습니다.
// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
다음으로 웹 클라이언트를 사용하여 프로필하려는 응용 프로그램의 URL을 요청하십시오.
http://example.com/article/1?XDEBUG_PROFILE=1
페이지가 처리 될 때와 비슷한 이름의 파일에 쓰게됩니다.
/tmp/cachegrind.out.12345
실행되는 각 PHP 요청 / 프로세스에 대해 하나의 파일을 작성합니다. 예를 들어 양식 게시를 분석하려는 경우 HTML 양식을 표시하는 GET 요청에 대해 하나의 프로필이 작성됩니다. XDEBUG_PROFILE 매개 변수는 양식을 처리하는 두 번째 요청을 분석하기 위해 후속 POST 요청에 전달되어야합니다. 따라서 프로파일 링 할 때 컬을 직접 실행하여 폼을 직접 POST 할 수 있습니다.
일단 작성되면 프로파일 캐시는 KCachegrind와 같은 응용 프로그램에서 읽을 수 있습니다.
그러면 다음 정보가 표시됩니다.
- 실행 된 기능
- 호출 시간, 그 자체 및 후속 함수 호출 포함
- 각 함수가 호출 된 횟수
- 콜 그래프
- 소스 코드에 대한 링크
분명히 성능 조정은 각 응용 프로그램의 사용 사례에 따라 매우 다릅니다. 일반적으로 찾는 것이 좋습니다.
- 당신이보기를 기대하지 않을 동일한 기능으로 반복 호출. 데이터를 처리하고 쿼리하는 함수의 경우 이는 응용 프로그램이 캐시 할 수있는 최상의 기회입니다.
- 느리게 실행되는 기능. 애플리케이션이 대부분의 시간을 보내는 곳은 어디입니까? 성능 튜닝에서 가장 좋은 결과는 응용 프로그램에서 가장 많은 시간을 소비하는 부분에 집중하는 것입니다.
참고 : Xdebug, 특히 프로파일 링 기능은 자원 집약적이며 PHP 실행 속도가 느립니다. 프로덕션 서버 환경에서 이들을 실행하지 않는 것이 좋습니다.