Avatar ·

Как получить текущее время в миллисекундах в PHP?

Всем привет! Я только начал изучать PHP и столкнулся с такой задачей: мне нужно замерить время выполнения скрипта с точностью до миллисекунд. Я знаю, что в PHP есть функция time(), которая возвращает текущую метку времени в секундах, но этого недостаточно — мне нужны миллисекунды. Пробовал использовать microtime(), но не совсем понял, как преобразовать её в удобный формат. Вот что я написал: ```php ``` Это работает, но даёт только секунды. А мне нужно что-то вроде: "Время выполнения: 0.023 секунды" или просто значение в миллисекундах, например 23 мс. Я слышал, что можно использовать microtime(true), но не понимаю, как правильно с ней работать. Также интересует, есть ли в PHP функция, которая сразу возвращает текущее время в миллисекундах (например, timestamp вроде 1700000123456)? Подскажите, как правильно получить текущее время в миллисекундах и как замерить время выполнения скрипта с высокой точностью? Буду благодарен за примеры кода. Спасибо! <<>>

Использование microtime() для получения миллисекунд

В PHP нет встроенной функции, которая возвращает timestamp в миллисекундах напрямую, но вы можете легко получить его с помощью microtime(). Эта функция возвращает текущую метку времени с микросекундами.

Существует два способа её использования:

  • microtime() — возвращает строку вида "0.12345678 1700000000" (микросекунды и секунды через пробел);
  • microtime(true) — возвращает число с плавающей точкой (float), где целая часть — это секунды, а дробная — микросекунды.

Чтобы получить время в миллисекундах, нужно умножить результат microtime(true) на 1000 и округлить до целого числа:

<?php
// Получаем текущее время в миллисекундах
$milliseconds = round(microtime(true) * 1000);
echo "Текущее время в миллисекундах: $milliseconds\n";

// Пример: 1700000123456
?>

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

Для измерения времени выполнения участка кода используйте разницу между двумя вызовами microtime(true):

<?php
$start = microtime(true);

// Ваш код, который нужно замерить
for ($i = 0; $i < 100000; $i++) {
    // какая-то операция
    $arr[] = sqrt($i);
}

$end = microtime(true);
$executionTime = $end - $start;

// Вывод в секундах с точностью до миллисекунд
echo "Время выполнения: " . round($executionTime, 4) . " секунд\n";

// Вывод в миллисекундах
echo "Время выполнения: " . round($executionTime * 1000, 2) . " мс\n";
?>

Форматирование времени для логов

Если вам нужно получить текущее время с миллисекундами в читаемом формате (например, для логов), используйте комбинацию DateTime и microtime():

<?php
function getCurrentTimeWithMilliseconds(): string {
    $micro = sprintf("%03d", (microtime(true) - floor(microtime(true))) * 1000);
    $now = new DateTime();
    return $now->format('Y-m-d H:i:s') . '.' . $micro;
}

echo getCurrentTimeWithMilliseconds(); // 2025-03-15 14:30:45.123
?>

Полезные советы

  • Для высокоточных замеров (менее 1 мс) используйте hrtime() (PHP 7.3+), которая возвращает время в наносекундах;
  • Не используйте time() для замеров — его точность 1 секунда;
  • При замерах учитывайте, что на результат влияет загрузка процессора и другие процессы;
  • Если нужно много раз получать время, сохраните microtime(true) в переменную, чтобы избежать повторных вызовов.

Вот полный пример скрипта для замера:

<?php
$start = microtime(true);

// Имитация работы
usleep(50000); // 50 миллисекунд

$end = microtime(true);

$seconds = $end - $start;
$milliseconds = $seconds * 1000;

echo "Секунды: " . round($seconds, 6) . "\n";
echo "Миллисекунды: " . round($milliseconds, 2) . "\n";
?>

Этот подход даёт точность до микросекунд и идеально подходит для большинства задач профилирования и логирования.

<<>>

Альтернативный подход: использование hrtime() для максимальной точности

Если вам нужна максимальная точность (наносекунды), используйте функцию hrtime(), доступную с PHP 7.3. Она возвращает время в наносекундах и не зависит от системных часов, что делает её идеальной для бенчмарков:

<?php
$start = hrtime(true);

// Ваш код
for ($i = 0; $i < 100000; $i++) {
    // операция
}

$end = hrtime(true);
$nanoseconds = $end - $start;
$milliseconds = $nanoseconds / 1e6;

echo "Время выполнения: " . round($milliseconds, 2) . " мс\n";
echo "Наносекунды: $nanoseconds\n";
?>

Когда что использовать:

  • microtime(true) — для общего логирования и замеров с точностью до микросекунд;
  • hrtime(true) — для высокоточных бенчмарков и профилирования;
  • time() — только для меток времени с точностью до секунды.

Также можно создать вспомогательную функцию для получения времени в миллисекундах:

<?php
function currentTimeMillis(): int {
    return (int) round(microtime(true) * 1000);
}
?>

Этот подход удобен, если вам часто нужно получать timestamp в миллисекундах для API или UUID.