Microtime: примеры (PHP)
microtime(bool $as_float = false): string|floatmicrotime() — это встроенная функция PHP, которая возвращает текущую метку времени Unix с микросекундами. Она часто используется для замеров времени выполнения скриптов, фрагментов кода или для генерации уникальных идентификаторов, основанных на времени.
- $as_float (bool) — необязательный параметр. Если передан
true, функция возвращает метку времени как число с плавающей точкой (float) в формате 'секунды.микросекунды'. По умолчаниюfalse— возвращает строку.
При вызове без параметров или с false возвращаемая строка имеет формат: 'микросекунды секунды', где секунды — целая часть временной метки, а микросекунды — дробная часть в секундах. Это сделано для удобства использования с функцией explode() или sscanf().
$time = microtime();
echo $time;0.12345600 1718899201$time = microtime(true);
echo $time;
var_dump($time);1718899201.1235
float(1718899201.1235)- time() — возвращает текущую метку времени Unix (количество секунд с начала эпохи). Используется, когда микросекунды не требуются.
- hrtime() (доступна с PHP 7.3) — возвращает монотонное системное время высокого разрешения в наносекундах в виде массива [секунды, наносекунды] или целого числа. Независима от системных часов. Предпочтительнее для точного профилирования производительности.
- date() и DateTime — используются для форматированного вывода даты и времени.
microtime()же предназначена для точных вычислений интервалов.
import time
# Аналог microtime(true)
t = time.time()
print(t) # e.g., 1718899201.1234561718899201.123456// Аналог microtime(true), но в миллисекундах
let t = performance.now();
console.log(t); // e.g., 1234.5678901
// Или время с начала эпохи в миллисекундах:
console.log(Date.now());1234.5678901
1718899201123Microtime в MySQL
-- Функция возвращает текущее время с микросекундами
SELECT MICROSECOND(NOW(6)), NOW(6);123456 | 2024-06-21 10:00:01.123456Основное отличие PHP-функции — возможность получить время как строку в специфичном формате, что является наследием старых версий. В современных сценариях чаще используют параметр true.
$start = microtime();
// ... код
$end = microtime();
$diff = $end - $start; // ОШИБКА: строки нельзя вычитать
echo $diff;0Правильный подход — использовать microtime(true).
microtime() зависит от системных часов. Если системное время изменится во время выполнения скрипта (например, корректировка NTP), замер интервала может быть неверным. Для точных замеров лучше использовать hrtime().
$start = microtime(true);
usleep(100); // 100 микросекунд
$end = microtime(true);
echo ($end - $start) * 1000000; // Перевод в микросекунды104.86793518066Результат может немного превышать ожидаемые 100 микросекунд из-за накладных расходов.
- PHP 5.0.0 — параметр
$get_as_floatстал доступен. Ранее функция всегда возвращала строку. - PHP 7.1.0 — реализация функции была изменена для использования монотонного системного времени, если оно доступно, что повысило точность и надежность для замеров интервалов.
- PHP 8.0.0 — параметр переименован из
$get_as_floatв$as_float. Старое название продолжает работать, но не рекомендуется.
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
// Имитация работы
sqrt($i);
}
$time_elapsed = microtime(true) - $start;
echo "Цикл выполнен за: {$time_elapsed} секунд";Цикл выполнен за: 0.0052340030670166 секундfunction generateTimeId() {
$microtime = microtime(true);
// Убираем точку и преобразуем в целое число
$id = str_replace('.', '', (string) $microtime);
// Добавляем случайность для одновременных вызовов
$id .= mt_rand(100, 999);
return $id;
}
echo generateTimeId();1718899201123456891$strTime = microtime(false); // "0.23456700 1718899201"
list($microseconds, $seconds) = explode(' ', $strTime);
$floatTime = (float) $seconds + (float) $microseconds;
echo $floatTime;1718899201.2346class 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 сек$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 сек