379 Stimmen

Verfolgung der Skriptausführungszeit in PHP

PHP muss die Menge an CPU-Zeit verfolgen, die ein bestimmtes Skript verbraucht hat, um das Limit max_execution_time durchzusetzen.

Gibt es eine Möglichkeit, innerhalb des Skripts Zugriff darauf zu erhalten? Ich möchte einige Protokollierung mit meinen Tests über wie viel CPU in der tatsächlichen PHP verbrannt wurde (die Zeit wird nicht erhöht, wenn das Skript sitzt und wartet auf die Datenbank).

Ich verwende einen Linux-Rechner.

1voto

JG Estiot Punkte 835

Y

$tstart = 0;
$tend = 0;

function timer_starts()
{
global $tstart;

$tstart=microtime(true); ;

}

function timer_ends()
{
global $tend;

$tend=microtime(true); ;

}

function timer_calc()
{
global $tstart,$tend;

return (round($tend - $tstart,2));
}

timer_starts();
file_get_contents('http://google.com');
timer_ends();
print('It took '.timer_calc().' seconds to retrieve the google page');

0voto

Zeth Punkte 1576

Dazu gibt es mehrere Möglichkeiten, die hier aufgeführt sind. Aber jede hat ihre eigenen Vor- und Nachteile. Und (meiner Meinung nach) ist die Lesbarkeit aller längeren Antworten schrecklich.

Deshalb habe ich beschlossen, alles in einer einzigen Antwort zusammenzufassen, die leicht zu verwenden und zu lesen ist.

Verwendung

$start = get_timers();
for( $i = 0; $i < 100000; $i++ ){
  // Code to check
}
$end = get_timers();
display_timer_statistics( $start, $end );

Funktionsdefinitionen

function display_timer_statistics( $start_timers, $end_timers ){

    // Settings
    $key_width = '100px';
    $decimals = 4;
    $decimals_wallclock = $decimals;
    $decimals_request_time_float = $decimals;

    // Variables
    $start_resource_usage_timer = $start_timers[0];
    $start_wallclock = $start_timers[1];
    $end_resource_usage_timer = $end_timers[0];
    $end_wallclock = $end_timers[1];

    // # User time
    // Add seconds and microseconds for the start/end, and subtract from another
    $end_user_time_seconds = $end_resource_usage_timer["ru_utime.tv_sec"]*1000;
    $end_user_time_microseconds = intval($end_resource_usage_timer["ru_utime.tv_usec"]/1000);
    $start_user_time_seconds = $start_resource_usage_timer["ru_utime.tv_sec"]*1000;
    $start_user_time_microseconds = intval($start_resource_usage_timer["ru_utime.tv_usec"]/1000);
    $total_user_time = ($end_user_time_seconds + $end_user_time_microseconds) - ($start_user_time_seconds + $start_user_time_microseconds);

    // # System time
    // Add seconds and microseconds for the start/end, and subtract from another
    $end_system_time_seconds = $end_resource_usage_timer["ru_stime.tv_sec"]*1000;
    $end_system_time_microseconds = intval($end_resource_usage_timer["ru_stime.tv_usec"]/1000);
    $start_system_time_seconds = $start_resource_usage_timer["ru_stime.tv_sec"]*1000;
    $start_system_time_microseconds = intval($start_resource_usage_timer["ru_stime.tv_usec"]/1000);
    $total_system_time = ($end_system_time_seconds + $end_system_time_microseconds) - ($start_system_time_seconds + $start_system_time_microseconds);

    // Wallclock
    $total_wallclock_time = number_format( ( $end_wallclock - $start_wallclock), $decimals_wallclock );

    // Server request_time_float
    $request_time_float = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
    $request_time_float = number_format( $request_time_float, $decimals_request_time_float );

    // Print
    $span_start = "<span style='width: $key_width; display: inline-block;'>";
    $span_end = "</span>";

    $output = "# RUNTIME AND TIMERS " . PHP_EOL ;
    $output .= PHP_EOL;
    $output .= $span_start . $total_user_time . $span_end . " User time (utime)" . PHP_EOL;
    $output .= $span_start . $total_system_time . $span_end . " System time (stime)" . PHP_EOL;
    $output .= PHP_EOL;
    $output .= $span_start . $total_wallclock_time . $span_end . " Wallclock" . PHP_EOL;
    $output .= PHP_EOL;
    $output .= $span_start . $request_time_float . $span_end . " REQUEST_TIME_FLOAT" . PHP_EOL . PHP_EOL . PHP_EOL;

    echo nl2br( $output );
}

function get_timers(){
    return [ getrusage(), microtime( true ) ];
}

Glossar

Alle erhalten von PHP-Dokumente für getrusage

  • Wallclock = Wie lange es dauert
  • ru = Ressourcenverbrauch
  • utime = Benutzte Zeit
  • stime = Verwendete Systemzeit
  • tv_sec = In Sekunden.
  • tv_usec = In Mikrosekunden.
  • tv = ?? Ich weiß es nicht.

0voto

Vasili Pascal Punkte 2716

Alternativ können Sie diese Zeile einfach in Ihre Code-Blöcke einfügen und die php-Logs überprüfen; bei wirklich langsamen Funktionen ist das ziemlich nützlich:

trigger_error("Task done at ". strftime('%H:%m:%S', time()), E_USER_NOTICE); 

Für ernsthafte Fehlersuche verwenden Sie XDebug + Cachegrind, siehe https://blog.nexcess.net/2011/01/29/diagnosing-slow-php-execution-with-xdebug-and-kcachegrind/

-2voto

ICP Punkte 97

Return microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X