microtime()
Функция PHP microtime() возвращает текущее время с точностью до микросекунд и используется для измерения производительности кода.
Введение
Во веб-разработке время играет ключевую роль. Функция PHP microtime() — это мощный инструмент, который разработчики используют для измерения производительности своего кода. Функция возвращает текущее время в секундах с момента начала эпохи Unix с точностью до микросекунд, что делает её надёжным способом измерить прошедшее время между двумя точками в коде. В этой статье мы подробно рассмотрим особенности этой функции и покажем, как применять её для повышения производительности ваших веб-приложений.
Что такое microtime()?
Функция microtime() возвращает текущее время в секундах с начала эпохи Unix (1 января 1970 года, 00:00:00 UTC) с точностью до микросекунд. Стандартная функция time() возвращает только целые секунды, поэтому когда нужно измерить что-то, что завершается за долю секунды — например, запрос к базе данных или цикл — используется microtime().
По умолчанию microtime() возвращает строку в формате "msec sec" — дробную часть (микросекунды в виде десятичного числа), за которой следуют пробел и целочисленная Unix-метка времени:
echo microtime();
// Output: "0.45678900 1698765432"
// ^ fraction ^ whole secondsЧитать такую строку неудобно, поэтому на практике почти всегда передают true, чтобы получить одно число с плавающей точкой, с которым можно работать арифметически:
echo microtime(true);
// Output: 1698765432.456789Синтаксис
microtime(bool $get_as_float = false): string|floatДоступна начиная с PHP 4.0.0. Функция принимает один необязательный boolean-параметр:
$get_as_float— еслиtrue, возвращаетfloatвидаseconds.microseconds. Еслиfalse(по умолчанию), возвращает строку"msec sec", описанную выше.
Если вам нужна метка времени из строки, возвращаемой по умолчанию, разбейте её по пробелу и сложите две части:
[$micro, $sec] = explode(' ', microtime());
$timestamp = (float) $sec + (float) $micro; // same as microtime(true)Использование
Основное назначение microtime() — бенчмаркинг: запишите microtime(true) перед блоком кода, затем снова после него и вычтите. Разница — это прошедшее реальное время в секундах. Это позволяет сравнивать два подхода, находить узкие места и проверять, действительно ли оптимизация дала результат.
Второй распространённый сценарий — создание идентификаторов на основе временной метки. Значение float меняется при каждом вызове, поэтому его можно включать в идентификатор. Однако следует помнить, что два вызова в одну и ту же микросекунду вернут одинаковое значение, а float хранит лишь ~15 значимых цифр — поэтому microtime() сама по себе не гарантирует уникальность. Для настоящих уникальных идентификаторов используйте специализированную функцию uniqid() (которая уже использует microtime), при необходимости с параметром uniqid('', true) для дополнительной энтропии.
microtime() и hrtime()
microtime() отражает системные часы, которые могут скакнуть назад (корректировки NTP, изменения часового пояса) и давать отрицательные или искажённые измерения. Для чисто временны́х замеров в PHP 7.3+ предпочтительнее использовать hrtime(): эта функция использует монотонный таймер высокого разрешения, который никогда не идёт назад, и возвращает наносекунды. Используйте microtime(), когда вам нужна реальная точка во времени, привязанная к эпохе Unix; используйте hrtime(), когда важно лишь сколько времени что-то заняло.
Примеры
Измерение времени выполнения скрипта
Классический паттерн: зафиксировать начало, выполнить код, зафиксировать конец, вычесть.
Этот пример измеряет время выполнения блока кода и выводит результат в секундах.
Бенчмаркинг реальной работы
Чтобы получить значимое и сравнимое число, запустите операцию много раз и отформатируйте результат. Здесь мы замеряем время 100 000 конкатенаций строк и выводим прошедшее время в миллисекундах:
<?php
$start = microtime(true);
$result = '';
for ($i = 0; $i < 100000; $i++) {
$result .= 'x';
}
$elapsed_ms = (microtime(true) - $start) * 1000;
echo "Built a " . strlen($result) . "-char string in "
. number_format($elapsed_ms, 2) . " ms";
// Example output: Built a 100000-char string in 4.31 msnumber_format() округляет float до двух знаков после запятой, чтобы вывод оставался аккуратным. Подробнее о параметрах форматирования — в number_format().
Идентификатор на основе временной метки
Из float можно получить идентификатор, но лучше хешировать его (или использовать как seed), а не раскрывать исходное значение:
Добавление random_int() устраняет риск коллизии двух идентификаторов, сгенерированных в одну микросекунду. В большинстве приложений встроенная функция uniqid() является более простым и специально предназначенным для этого выбором.
Заключение
Функция microtime() — незаменимый инструмент для измерения прошедшего времени в PHP. Зафиксируйте её значение до и после блока кода, вычтите — и вы получите точную продолжительность. Просто помните, что она отслеживает системные часы — для чисто временны́х замеров в PHP 7.3+ используйте hrtime(), а для временны́х меток с точностью до секунды — time().