Microtime: примеры (PHP)

Использование microtime для точного измерения времени в PHP
Раздел: Дата и время
microtime(bool $as_float = false): string|float

microtime() — это встроенная функция PHP, которая возвращает текущую метку времени Unix с микросекундами. Она часто используется для замеров времени выполнения скриптов, фрагментов кода или для генерации уникальных идентификаторов, основанных на времени.

Аргументы функции
  • $as_float (bool) — необязательный параметр. Если передан true, функция возвращает метку времени как число с плавающей точкой (float) в формате 'секунды.микросекунды'. По умолчанию false — возвращает строку.

При вызове без параметров или с false возвращаемая строка имеет формат: 'микросекунды секунды', где секунды — целая часть временной метки, а микросекунды — дробная часть в секундах. Это сделано для удобства использования с функцией explode() или sscanf().

Примеры использования
Возврат строки (по умолчанию)
$time = microtime();
echo $time;
0.12345600 1718899201
Возврат числа (float)
$time = microtime(true);
echo $time;
var_dump($time);
1718899201.1235
float(1718899201.1235)
Похожие функции в PHP
  • time() — возвращает текущую метку времени Unix (количество секунд с начала эпохи). Используется, когда микросекунды не требуются.
  • hrtime() (доступна с PHP 7.3) — возвращает монотонное системное время высокого разрешения в наносекундах в виде массива [секунды, наносекунды] или целого числа. Независима от системных часов. Предпочтительнее для точного профилирования производительности.
  • date() и DateTime — используются для форматированного вывода даты и времени. microtime() же предназначена для точных вычислений интервалов.
Аналоги в других языках
Python (модуль time)
import time
# Аналог microtime(true)
t = time.time()
print(t)  # e.g., 1718899201.123456
1718899201.123456
JavaScript (в браузере и Node.js)
// Аналог microtime(true), но в миллисекундах
let t = performance.now();
console.log(t); // e.g., 1234.5678901
// Или время с начала эпохи в миллисекундах:
console.log(Date.now());
1234.5678901
1718899201123

Microtime в MySQL

-- Функция возвращает текущее время с микросекундами
SELECT MICROSECOND(NOW(6)), NOW(6);
123456 | 2024-06-21 10:00:01.123456

Основное отличие PHP-функции — возможность получить время как строку в специфичном формате, что является наследием старых версий. В современных сценариях чаще используют параметр true.

Типичные ошибки
1. Неправильный расчёт интервала при использовании строкового формата
$start = microtime();
// ... код
$end = microtime();
$diff = $end - $start; // ОШИБКА: строки нельзя вычитать
echo $diff;
0

Правильный подход — использовать microtime(true).

2. Ожидание монотонного времени

microtime() зависит от системных часов. Если системное время изменится во время выполнения скрипта (например, корректировка NTP), замер интервала может быть неверным. Для точных замеров лучше использовать hrtime().

3. Потеря точности при математических операциях
$start = microtime(true);
usleep(100); // 100 микросекунд
$end = microtime(true);
echo ($end - $start) * 1000000; // Перевод в микросекунды
104.86793518066

Результат может немного превышать ожидаемые 100 микросекунд из-за накладных расходов.

Изменения в версиях PHP
  • PHP 5.0.0 — параметр $get_as_float стал доступен. Ранее функция всегда возвращала строку.
  • PHP 7.1.0 — реализация функции была изменена для использования монотонного системного времени, если оно доступно, что повысило точность и надежность для замеров интервалов.
  • PHP 8.0.0 — параметр переименован из $get_as_float в $as_float. Старое название продолжает работать, но не рекомендуется.
Расширенные примеры
1. Точный замер времени выполнения блока кода
Пример php
$start = microtime(true);

for ($i = 0; $i < 100000; $i++) {
    // Имитация работы
    sqrt($i);
}

$time_elapsed = microtime(true) - $start;
echo "Цикл выполнен за: {$time_elapsed} секунд";
Цикл выполнен за: 0.0052340030670166 секунд
2. Генерация уникального ID на основе времени
Пример php
function generateTimeId() {
    $microtime = microtime(true);
    // Убираем точку и преобразуем в целое число
    $id = str_replace('.', '', (string) $microtime);
    // Добавляем случайность для одновременных вызовов
    $id .= mt_rand(100, 999);
    return $id;
}
echo generateTimeId();
1718899201123456891
3. Преобразование строкового формата в float
Пример php
$strTime = microtime(false); // "0.23456700 1718899201"
list($microseconds, $seconds) = explode(' ', $strTime);
$floatTime = (float) $seconds + (float) $microseconds;
echo $floatTime;
1718899201.2346
4. Профилирование с накоплением времени
Пример php
class Profiler {
    private static $timers = [];
    public static function start($name) {
        self::$timers[$name] = microtime(true);
    }
    public static function end($name) {
        if (!isset(self::$timers[$name])) return 0;
        $diff = microtime(true) - self::$timers[$name];
        echo "[$name] выполнено за: " . round($diff, 4) . " сек
"; return $diff; } } Profiler::start('db_query'); usleep(150000); // Имитация запроса Profiler::end('db_query');
[db_query] выполнено за: 0.1501 сек
5. Сравнение с hrtime()
Пример php
$startMicro = microtime(true);
$startHr = hrtime(true);
usleep(500);
$endMicro = microtime(true);
$endHr = hrtime(true);

echo "microtime diff: " . ($endMicro - $startMicro) . " сек
"; echo "hrtime diff: " . ($endHr - $startHr) / 1e9 . " сек";
microtime diff: 0.50051212310791 сек
hrtime diff: 0.500512123 сек

PHP microtime function comments

En
Microtime Return current Unix timestamp with microseconds