PHP 必须跟踪特定脚本使用的 CPU 时间量,以强制执行 max_execution_time 限制。
有没有办法在脚本内部访问它?我想在我的测试中包含一些关于实际 PHP 中消耗了多少 CPU 的日志记录(当脚本等待数据库时,时间不会增加)。
我正在使用 Linux 机器。
原文由 twk 发布,翻译遵循 CC BY-SA 4.0 许可协议
PHP 必须跟踪特定脚本使用的 CPU 时间量,以强制执行 max_execution_time 限制。
有没有办法在脚本内部访问它?我想在我的测试中包含一些关于实际 PHP 中消耗了多少 CPU 的日志记录(当脚本等待数据库时,时间不会增加)。
我正在使用 Linux 机器。
原文由 twk 发布,翻译遵循 CC BY-SA 4.0 许可协议
有几种方法可以做到这一点,这里列出。但每个人都有自己的优点和缺点。而且(在我看来)所有较长答案的可读性都很糟糕。
因此,我决定将所有内容放在一个答案中,该答案易于使用和阅读。
$start = get_timers();
for( $i = 0; $i < 100000; $i++ ){
// Code to check
}
$end = get_timers();
display_timer_statistics( $start, $end );
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 ) ];
}
全部来自 getrusage 的 PHP 文档
ru
= 资源使用情况utime
= 用户使用时间stime
= 使用的系统时间tv_sec
= 以秒为单位。tv_usec
= 以微秒为单位。tv
= ??不知道原文由 Zeth 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答722 阅读✓ 已解决
2 回答2.3k 阅读
1 回答687 阅读✓ 已解决
在 unixoid 系统上(以及在 Windows 上的 php 7+ 中),您可以使用 getrusage ,例如:
请注意,如果您为每个测试生成一个 php 实例,则不需要计算差异。