gettimeofday()
Функция PHP gettimeofday(): синтаксис, возвращаемые значения, параметр as_float, удаление в PHP 8.0 и замена на microtime(true).
Функция PHP gettimeofday()
Функция gettimeofday() возвращает текущее системное время. По умолчанию она возвращает ассоциативный массив с секундами и микросекундами, прошедшими с эпохи Unix, а также данными о часовом поясе. Если необязательный аргумент установлен в true, функция возвращает время в виде единственного значения типа float.
Важно:
gettimeofday()была удалена в PHP 8.0.0. Если вы пишете или поддерживаете современный PHP-код, используйтеmicrotime(true)для получения высокоточных временных меток. В этой главе описывается устаревшая функция и показана рекомендуемая замена, чтобы вы могли уверенно перенести старый код.
На этой странице рассматриваются синтаксис, необязательный параметр, точное возвращаемое значение, рабочие примеры и рекомендации по замене функции.
Синтаксис
gettimeofday(bool $as_float = false): array|floatПараметры
| Параметр | Тип | Описание |
|---|---|---|
$as_float | bool | Необязательный. При значении true возвращает единственное значение float (секунды с микросекундами). Если опущен или равен false, возвращает ассоциативный массив. По умолчанию false. |
Возвращаемое значение
Когда $as_float равен false (по умолчанию), gettimeofday() возвращает ассоциативный массив со следующими ключами:
sec— секунды с начала эпохи Unix (int).usec— микросекунды в рамках текущей секунды (int).minuteswest— количество минут к западу от Гринвича (int).dsttime— тип коррекции летнего времени (int).
Когда $as_float равен true, возвращается единственное значение float: количество секунд с начала эпохи, где микросекунды выражены как дробная часть.
Пример: стандартный вид массива
<?php
$now = gettimeofday();
print_r($now);Типичный результат выглядит так (числа зависят от момента запуска):
Array
(
[sec] => 1718928000
[usec] => 512340
[minuteswest] => 0
[dsttime] => 0
)Пример: вид float
Передача true возвращает одно значение, которое можно сразу использовать в арифметических операциях — удобно для измерения прошедшего времени:
<?php
$float = gettimeofday(true);
echo $float; // e.g. 1718928000.51234Рекомендуемая замена: microtime(true)
Поскольку gettimeofday() больше не существует в PHP 8.0+, переносимым способом получения высокоточной временной метки является microtime(true), которая возвращает аналогичное значение типа float:
<?php
$start = microtime(true);
// ... code you want to time ...
for ($i = 0; $i < 1_000_000; $i++) {
// busy work
}
$elapsed = microtime(true) - $start;
echo "Elapsed: " . round($elapsed, 6) . " seconds";Если вам конкретно нужно разделение на секунды и микросекунды, которое давал старый массив, вы можете воссоздать его из microtime(true):
<?php
$t = microtime(true);
$sec = (int) $t;
$usec = (int) round(($t - $sec) * 1_000_000);
echo "sec={$sec}, usec={$usec}";Когда это может пригодиться?
Вы будете встречать gettimeofday() в основном при чтении или обновлении устаревшего кода, написанного для PHP 5 или 7. В реальных проектах она использовалась для:
- Высокоточного измерения времени и профилирования (сколько времени занимает блок кода или запрос к базе данных).
- Создания временных меток с субсекундным разрешением для логов.
Для всех этих задач современный PHP-код должен использовать microtime(true). Для целых секунд, когда микросекунды не важны, time() проще, а getdate() возвращает именованный массив частей даты. Чтобы отформатировать любое из этих значений в удобочитаемую строку, смотрите функцию date().
Производительность
gettimeofday() является системным вызовом, поэтому имеет небольшие накладные расходы. Что важнее, вызов этой функции в PHP 8.0+ вызывает ошибку Error, поскольку функция была удалена. microtime(true) поддерживается во всех актуальных версиях PHP, является легковесной и возвращает значение float, готовое к арифметическим операциям — что делает её правильным выбором для нового кода.
Заключение
gettimeofday() возвращала текущее время либо в виде ассоциативного массива (sec, usec, minuteswest, dsttime), либо — при значении $as_float равном true — в виде единственного float. Функция была удалена в PHP 8.0.0, поэтому для точных временных меток с микросекундами и профилирования в современном PHP используйте microtime(true).