Функция microtime()
с переданным значением true возвращает число секунд, прошедших с полуночи 01.01.1970, причём это значение подсчитано до сотых долей секунды. Затем идёт сам скрипт (исполняемый код), который мы и проверяем. В последней строкой будет разница между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта. Разница времени после выполнения скрипта и времени до начала его работы, и есть время выполнения скрипта.
$start = microtime(true);
echo 'Время выполнения скрипта: ' . (microtime(true) - $start) . ' sec.';
Результат:
// Время выполнения скрипта: 0.16499996185303 sec.
Можно вместо $start = microtime(true)
брать значение из переменной $_SERVER['REQUEST_TIME_FLOAT']
, которая содержит время запроса к серверу. Вычисление времени выполнения происходит за исполняемым кодом.
$time = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];
echo $time . ' sec.';
Если на сервере установлен Xdebag:
echo xdebug_time_index() . ' sec.';
Можно подсчитать среднее значение выполнения скрипта и записать результат в логи:
$start = microtime(true);
$time = round(microtime(true) - $start, 3);
$f = fopen('time.log', 'a');
fwrite($f, $time . PHP_EOL);
fclose($f);
$log = file('time.log');
$result = round(array_sum($log) / count($log), 3);
echo $result . ' sec.';
Очень простой класс, который можно использовать для получения времени выполнения скрипта PHP. Имеет приватное статическое свойство $start
, в которой будет храниться время начала выполнения скрипта и имеющее значение по умолчанию $start = .0. Метод start()
присваивает значение, которое вернула функция microtime
свойству $start
. Метод finish()
возвращает разницу между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта (присвоили значение в $start
).
// Класс для измерения времени выполнения скрипта PHP
class Timer
{
// @var float время начала выполнения скрипта
private static $start = .0;
// Начало выполнения
public static function start()
{
self::$start = microtime(true);
}
// Разница между текущей меткой времени и меткой self::$start @return float
public static function finish()
{
return microtime(true) - self::$start;
}
}
Так используем класс:
Timer::start();
echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.';
// Пример использования класса Timer(). Заполним массив миллионом случайных чисел.
Timer::start();
for ($i = 0; $i < 1000000; $i++) {
$array[] = rand(0, 1000000);
}
echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.';
Функция memory_get_usage() возвращает количество памяти в байтах, которое было выделено PHP скрипту на данный момент.
Принцип очень похож на измерение времени выполнения скрипта, о котором речь шла выше. Здесь тоже есть, как бы, стартовое состояние и и разница между текущим состоянием и стартовым.
$memory = memory_get_usage();
echo 'Скушано памяти: ' . (memory_get_usage() - $memory) . ' байт';
В Xdebug есть функция xdebug_memory_usage(), которая возвращает тот же результат.
echo 'Скушано памяти: ' . xdebug_memory_usage() . ' байт';
// Результат: Скушано памяти: 36018960 байт
$memory = memory_get_usage();
for ($i = 0; $i < 1000000; $i++) {
$array[] = rand(0, 1000000);
}
$memory = memory_get_usage() - $memory;
// Конвертация результата в килобайты и мегабайты
$i = 0;
while (floor($memory / 1024) > 0) {
$i++;
$memory /= 1024;
}
$name = array('байт', 'КБ', 'МБ');
echo 'Скушано памяти: ' . round($memory, 2) . ' ' . $name[$i];
// Результат: Скушано памяти: 34 МБ
Timer::start();
$memory = memory_get_usage();
// начало исполняемого кода
for ($i = 0; $i < 1000000; $i++) {
$array[] = rand(0, 1000000);
}
// конец исполняемого кода
$memory = memory_get_usage() - $memory;
$name = array('байт', 'КБ', 'МБ');
$i = 0;
while (floor($memory / 1024) > 0) {
$i++;
$memory /= 1024;
}
echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.<br>';
echo 'Скушано памяти: ' . round($memory, 2) . ' ' . $name[$i];
// Результат: Время выполнения скрипта: 0.79099988937378 sec.
// Скушано памяти: 34 МБ
Вывести время выполнения скрипта и объём потреблённой памяти в Yii2:
echo '<!-- ' . sprintf('%0.3f', Yii::getLogger()->getElapsedTime()) , 'с. ' . round(memory_get_peak_usage()/(1024*1024), 2) . 'МБ -->';