W3docs

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(), когда важно лишь сколько времени что-то заняло.

Примеры

Измерение времени выполнения скрипта

Классический паттерн: зафиксировать начало, выполнить код, зафиксировать конец, вычесть.

php— editable, runs on the server

Этот пример измеряет время выполнения блока кода и выводит результат в секундах.

Бенчмаркинг реальной работы

Чтобы получить значимое и сравнимое число, запустите операцию много раз и отформатируйте результат. Здесь мы замеряем время 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 ms

number_format() округляет float до двух знаков после запятой, чтобы вывод оставался аккуратным. Подробнее о параметрах форматирования — в number_format().

Идентификатор на основе временной метки

Из float можно получить идентификатор, но лучше хешировать его (или использовать как seed), а не раскрывать исходное значение:

php— editable, runs on the server

Добавление random_int() устраняет риск коллизии двух идентификаторов, сгенерированных в одну микросекунду. В большинстве приложений встроенная функция uniqid() является более простым и специально предназначенным для этого выбором.

Заключение

Функция microtime() — незаменимый инструмент для измерения прошедшего времени в PHP. Зафиксируйте её значение до и после блока кода, вычтите — и вы получите точную продолжительность. Просто помните, что она отслеживает системные часы — для чисто временны́х замеров в PHP 7.3+ используйте hrtime(), а для временны́х меток с точностью до секунды — time().

Практика

Практика
Какова функция microtime() в PHP?
Какова функция microtime() в PHP?
Was this page helpful?