복붙노트

PHP 스크립트를 프로파일 링하는 가장 간단한 방법

PHP

PHP 스크립트를 프로파일 링하는 가장 간단한 방법

PHP 스크립트를 프로파일 링하는 가장 쉬운 방법은 무엇입니까?

나는 그것에 대해 무언가를 붙이는 것을 좋아할 것입니다. 모든 함수 호출의 덤프를 보여 주며 얼마나 오래 걸렸는지를 보여줍니다.하지만 특정 함수에 뭔가를 두는 것 또한 괜찮습니다.

마이크로 시간 기능을 실험 해 보았습니다.

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

하지만 때로는 부정적인 결과를 낳습니다. 게다가 코드 전체에 뿌리는데 많은 어려움이 있습니다.

해결법

  1. ==============================

    1.PECL APD 확장은 다음과 같이 사용됩니다.

    PECL APD 확장은 다음과 같이 사용됩니다.

    <?php
    apd_set_pprof_trace();
    
    //rest of the script
    ?>
    

    그런 다음, 생성 된 파일을 pprofp를 사용하여 구문 분석하십시오.

    예제 출력 :

    Trace for /home/dan/testapd.php
    Total Elapsed Time = 0.00
    Total System Time  = 0.00
    Total User Time    = 0.00
    
    
    Real         User        System             secs/    cumm
    %Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
    --------------------------------------------------------------------------------------
    100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
    56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
    28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
    14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace
    
  2. ==============================

    2.내 생각에 xdebug를 원해. 서버에 설치하고 전원을 켜고 kcachegrind (Linux의 경우) 또는 wincachegrind (Windows의 경우)를 통해 출력을 펌프하면 정확한 타이밍, 카운트 및 메모리 사용에 대해 자세히 설명하는 몇 가지 예쁜 차트가 표시됩니다. 그것을위한 또 다른 확장이 필요함).

    내 생각에 xdebug를 원해. 서버에 설치하고 전원을 켜고 kcachegrind (Linux의 경우) 또는 wincachegrind (Windows의 경우)를 통해 출력을 펌프하면 정확한 타이밍, 카운트 및 메모리 사용에 대해 자세히 설명하는 몇 가지 예쁜 차트가 표시됩니다. 그것을위한 또 다른 확장이 필요함).

    그것은 진지하게 흔들립니다. D

  3. ==============================

    3.확장 기능이 필요하지 않습니다. 간단한 프로파일 링을 위해이 두 기능을 사용하십시오.

    확장 기능이 필요하지 않습니다. 간단한 프로파일 링을 위해이 두 기능을 사용하십시오.

    // Call this at each point of interest, passing a descriptive string
    function prof_flag($str)
    {
        global $prof_timing, $prof_names;
        $prof_timing[] = microtime(true);
        $prof_names[] = $str;
    }
    
    // Call this when you're done and want to see the results
    function prof_print()
    {
        global $prof_timing, $prof_names;
        $size = count($prof_timing);
        for($i=0;$i<$size - 1; $i++)
        {
            echo "<b>{$prof_names[$i]}</b><br>";
            echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
        }
        echo "<b>{$prof_names[$size-1]}</b><br>";
    }
    

    다음은 각 검사 점에서 설명과 함께 prof_flag ()를 호출하고 끝에있는 prof_print ()를 호출하는 예제입니다.

    prof_flag("Start");
    
       include '../lib/database.php';
       include '../lib/helper_func.php';
    
    prof_flag("Connect to DB");
    
       connect_to_db();
    
    prof_flag("Perform query");
    
       // Get all the data
    
       $select_query = "SELECT * FROM data_table";
       $result = mysql_query($select_query);
    
    prof_flag("Retrieve data");
    
       $rows = array();
       $found_data=false;
       while($r = mysql_fetch_assoc($result))
       {
           $found_data=true;
           $rows[] = $r;
       }
    
    prof_flag("Close DB");
    
       mysql_close();   //close database connection
    
    prof_flag("Done");
    prof_print();
    

    출력은 다음과 같습니다.

    시작 0.004303 DB에 연결 0.003518Perform 쿼리 0.000308 데이터 검색 0.000009Close DB 0.000049Done

  4. ==============================

    4.마이크로 시간을 빼면 부정적인 결과가 나오면 참 (microtime (true)) 인수로 함수를 사용해보십시오. true이면이 함수는 문자열이 아닌 float를 반환합니다 (인수없이 호출 된 경우처럼).

    마이크로 시간을 빼면 부정적인 결과가 나오면 참 (microtime (true)) 인수로 함수를 사용해보십시오. true이면이 함수는 문자열이 아닌 float를 반환합니다 (인수없이 호출 된 경우처럼).

  5. ==============================

    5.솔직히, 프로파일 링을 위해 NewRelic을 사용하는 것이 최선이라고 주장 할 것입니다.

    솔직히, 프로파일 링을 위해 NewRelic을 사용하는 것이 최선이라고 주장 할 것입니다.

    그것은 런타임을 전혀 늦추지 않는 것처럼 보이는 PHP 확장이며, 당신을 위해 모니터링을 수행하여 적절한 드릴 다운을 허용합니다. 비싼 버전에서는 무거운 드릴 다운을 허용합니다 (하지만 가격 책정 모델을 구매할 여력이 없습니다).

    그래도 무료 / 표준 계획을 사용하더라도 낮게 매달린 과일의 대부분이 분명하고 단순합니다. 또한 DB 상호 작용에 대한 아이디어를 줄 수 있기를 바랍니다.

  6. ==============================

    6.Crossing from SO Documentation 베타가 오프라인으로 바뀌 었습니다.

    Crossing from SO Documentation 베타가 오프라인으로 바뀌 었습니다.

    Xdebug라는 PHP 확장은 PHP 응용 프로그램의 프로파일 링과 런타임 디버깅을 지원합니다. 프로파일 러를 실행할 때 출력은 "cachegrind"라는 이진 형식의 파일에 기록됩니다. 이 파일을 분석하기 위해 각 플랫폼에서 응용 프로그램을 사용할 수 있습니다. 이 프로파일 링을 수행하기 위해 응용 프로그램 코드를 변경하지 않아도됩니다.

    프로파일 링을 사용하려면 확장을 설치하고 php.ini 설정을 조정하십시오. 일부 Linux 배포판에는 표준 패키지 (예 : Ubuntu의 php-xdebug 패키지)가 제공됩니다. 이 예에서는 요청 매개 변수에 따라 선택적으로 프로필을 실행합니다. 이렇게하면 설정을 정적으로 유지하고 필요할 때만 프로파일 러를 켤 수 있습니다.

    // 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
    

    기본적으로 파일 이름의 번호는 작성한 프로세스 ID입니다. 이것은 xdebug.profiler_output_name 설정으로 구성 할 수 있습니다.

    실행되는 각 PHP 요청 / 프로세스에 대해 하나의 파일을 작성합니다. 예를 들어 양식 게시를 분석하려는 경우 HTML 양식을 표시하는 GET 요청에 대해 하나의 프로필이 작성됩니다. XDEBUG_PROFILE 매개 변수는 양식을 처리하는 두 번째 요청을 분석하기 위해 후속 POST 요청에 전달되어야합니다. 따라서 프로파일 링 할 때 컬을 직접 실행하여 폼을 직접 POST 할 수 있습니다.

    일단 작성되면 프로파일 캐시는 KCachegrind 또는 Webgrind와 같은 응용 프로그램에서 읽을 수 있습니다.

    그러면 다음 정보가 표시됩니다.

    분명히 성능 조정은 각 응용 프로그램의 사용 사례에 따라 매우 다릅니다. 일반적으로 찾는 것이 좋습니다.

    참고 : Xdebug, 특히 프로파일 링 기능은 자원 집약적이며 PHP 실행 속도가 느립니다. 프로덕션 서버 환경에서 이들을 실행하지 않는 것이 좋습니다.

  7. ==============================

    7.PECL XHPROF도 인 테린 스팅을 시도합니다. 보고서를보고 매우 간단한 문서를 볼 수있는 클릭 가능한 HTML 인터페이스가 있습니다. 나는 아직 그것을 시험해보아야한다.

    PECL XHPROF도 인 테린 스팅을 시도합니다. 보고서를보고 매우 간단한 문서를 볼 수있는 클릭 가능한 HTML 인터페이스가 있습니다. 나는 아직 그것을 시험해보아야한다.

  8. ==============================

    8.프로파일 링을 위해 phpDebug를 사용하고 싶습니다. http://phpdebug.sourceforge.net/www/index.html

    프로파일 링을 위해 phpDebug를 사용하고 싶습니다. http://phpdebug.sourceforge.net/www/index.html

    그것은 포함 된 모든 파일뿐만 아니라 사용 된 SQL에 대한 모든 시간 / 메모리 사용을 출력합니다. 분명히 추상화 된 코드에서 가장 잘 작동합니다.

    함수와 클래스 프로파일 링을 위해 나는 microtime () + get_memory_usage () + get_peak_memory_usage ()를 사용할 것이다.

  9. ==============================

    9.가난한 사람의 프로파일 링이며 확장자가 필요하지 않습니다. 중첩 된 프로필 및 총 비율 지원 :

    가난한 사람의 프로파일 링이며 확장자가 필요하지 않습니다. 중첩 된 프로필 및 총 비율 지원 :

    function p_open($flag) {
        global $p_times;
        if (null === $p_times)
            $p_times = [];
        if (! array_key_exists($flag, $p_times))
            $p_times[$flag] = [ 'total' => 0, 'open' => 0 ];
        $p_times[$flag]['open'] = microtime(true);
    }
    
    function p_close($flag)
    {
        global $p_times;
        if (isset($p_times[$flag]['open'])) {
            $p_times[$flag]['total'] += (microtime(true) - $p_times[$flag]['open']);
            unset($p_times[$flag]['open']);
        }
    }
    
    function p_dump()
    {
        global $p_times;
        $dump = [];
        $sum  = 0;
        foreach ($p_times as $flag => $info) {
            $dump[$flag]['elapsed'] = $info['total'];
            $sum += $info['total'];
        }
        foreach ($dump as $flag => $info) {
            $dump[$flag]['percent'] = $dump[$flag]['elapsed']/$sum;
        }
        return $dump;
    }
    

    예:

    <?php
    
    p_open('foo');
    sleep(1);
    p_open('bar');
    sleep(2);
    p_open('baz');
    sleep(3);
    p_close('baz');
    sleep(2);
    p_close('bar');
    sleep(1);
    p_close('foo');
    
    var_dump(p_dump());
    

    수율 :

    array:3 [
      "foo" => array:2 [
        "elapsed" => 9.000766992569
        "percent" => 0.4736904954747
      ]
      "bar" => array:2 [
        "elapsed" => 7.0004580020905
        "percent" => 0.36841864946596
      ]
      "baz" => array:2 [
        "elapsed" => 3.0001420974731
        "percent" => 0.15789085505934
      ]
    ]
    
  10. ==============================

    10.나는 확실히 BlackFire를 시험해 볼 것입니다.

    나는 확실히 BlackFire를 시험해 볼 것입니다.

    Blackbox와 함께 사용하는 다른 PHP 프레임 워크를 테스트하기 위해 puphpet을 사용하여 만든 VirtualBox가 있습니다. 필요할 경우 포크 및 / 또는 배포 할 수 있습니다. :)

    https://github.com/webit4me/PHPFrameworks

  11. ==============================

    11.당신의 예제에서와 같이 벤치마킹을 위해, 나는 배 벤치 마크 패키지를 사용합니다. 측정을 위해 마커를 설정합니다. 클래스는 또한 몇 가지 프리젠 테이션 헬퍼를 제공하거나 적합하다고 판단되는 데이터를 처리 할 수 ​​있습니다.

    당신의 예제에서와 같이 벤치마킹을 위해, 나는 배 벤치 마크 패키지를 사용합니다. 측정을 위해 마커를 설정합니다. 클래스는 또한 몇 가지 프리젠 테이션 헬퍼를 제공하거나 적합하다고 판단되는 데이터를 처리 할 수 ​​있습니다.

    실제로 __destruct 메서드를 사용하여 다른 클래스에 래핑했습니다. 스크립트가 종료되면 출력은 log4php를 통해 syslog에 기록되므로 작업 할 많은 성능 데이터가 있습니다.

  12. ==============================

    12.XDebug는 안정적이지 않으며 특정 PHP 버전에서 항상 사용 가능한 것은 아닙니다. 예를 들어 일부 서버에서는 여전히 PHP 5.1.6을 실행합니다. RedHat RHEL5에 포함되어 있으며 (여전히 중요한 모든 문제에 대한 업데이트를받습니다) 최근 XDebug는이 PHP로 컴파일하지 않습니다. 그래서 DBG 디버거로 전환하는 것으로 끝났습니다. php 벤치마킹은 함수, 메소드, 모듈 및 짝수 라인을위한 타이밍을 제공합니다.

    XDebug는 안정적이지 않으며 특정 PHP 버전에서 항상 사용 가능한 것은 아닙니다. 예를 들어 일부 서버에서는 여전히 PHP 5.1.6을 실행합니다. RedHat RHEL5에 포함되어 있으며 (여전히 중요한 모든 문제에 대한 업데이트를받습니다) 최근 XDebug는이 PHP로 컴파일하지 않습니다. 그래서 DBG 디버거로 전환하는 것으로 끝났습니다. php 벤치마킹은 함수, 메소드, 모듈 및 짝수 라인을위한 타이밍을 제공합니다.

  13. from https://stackoverflow.com/questions/21133/simplest-way-to-profile-a-php-script by cc-by-sa and MIT license