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

Функция gettimeofday в PHP: возможности и практические примеры
Раздел: Дата и время
gettimeofday(bool $return_float = false): array|float
Функция gettimeofday в PHP

Функция gettimeofday() возвращает информацию о текущем системном времени. Она применяется для получения времени с микросекундной точностью, что полезно для замера производительности, логирования событий или синхронизации операций.

Аргументы функции

Функция принимает один необязательный параметр:

  • $return_float (bool) — определяет формат возвращаемого значения.
Возвращаемые значения

При вызове без аргументов или с $return_float = false функция возвращает ассоциативный массив:

  • sec — секунды с начала эпохи Unix (1 января 1970 года).
  • usec — микросекунды.
  • minuteswest — смещение минут к западу от Гринвича.
  • dsttime — тип коррекции летнего времени.

При установке $return_float = true возвращается число с плавающей точкой (float), представляющее текущее время в секундах с микросекундной точностью.

Примеры использования gettimeofday
Без параметров
$timeArray = gettimeofday();
print_r($timeArray);
Array
(
    [sec] => 1700000000
    [usec] => 123456
    [minuteswest] => -180
    [dsttime] => 0
)
С параметром true
$timeFloat = gettimeofday(true);
echo $timeFloat;
1700000000.1235
Расчет времени выполнения
$start = gettimeofday(true);
// Код для замера
usleep(100000); // Задержка 100 миллисекунд
$end = gettimeofday(true);
$executionTime = $end - $start;
echo sprintf("Время выполнения: %.6f сек", $executionTime);
Время выполнения: 0.100152 сек
Альтернативные функции в PHP

Функция microtime() также возвращает текущую временную метку с микросекундами. Различие в формате вывода: microtime по умолчанию возвращает строку, но может вернуть float при вызове с параметром true.

echo microtime(true);
1700000000.1235

Функция time() возвращает количество секунд с начала эпохи Unix без микросекунд. Используется, когда высокая точность не требуется.

echo time();
1700000000
hrtime

Функция hrtime() доступна с PHP 7.3 и предоставляет монотонное время с наносекундной точностью. Предпочтительна для точных замеров производительности.

$start = hrtime(true);
usleep(1000);
$end = hrtime(true);
echo $end - $start . ' наносекунд';
1023000 наносекунд
Аналоги в других языках

Gettimeofday в Python

Модуль time предоставляет функцию time() для секунд и perf_counter() для высокоточных замеров.

import time
t = time.time()
print(t)
1700000000.123456

Gettimeofday в Javascript

Метод performance.now() возвращает время с микросекундной точностью относительно начала загрузки страницы.

console.log(performance.now());
12345.678901234

Gettimeofday в MySQL

Функция NOW() возвращает текущую дату и время с точностью до секунд, а MICROSECOND() может извлекать микросекунды.

SELECT NOW(6);
2023-11-14 12:34:56.123456

Gettimeofday в C

В языке C функция gettimeofday() из заголовка sys/time.h имеет схожую семантику, но возвращает структуру timeval.

#include 
struct timeval tv;
gettimeofday(&tv, NULL);
printf("%ld.%06ld", tv.tv_sec, tv.tv_usec);
1700000000.123456
Типичные ошибки
Ошибки округления

При вычитании значений float могут возникать ошибки округления. Для точных вычислений лучше использовать целочисленные значения.

$a = gettimeofday(true);
$b = gettimeofday(true);
// $a и $b могут быть одинаковыми при быстром выполнении
if ($a == $b) {
    echo 'Время совпадает';
}
Время совпадает
Неверная интерпретация массива

Значение minuteswest может быть отрицательным, что указывает на смещение к востоку от Гринвича.

$time = gettimeofday();
$offset = $time['minuteswest'] / 60;
echo 'Часовой пояс: UTC' . ($offset <= 0 ? '+' : '') . -$offset;
Часовой пояс: UTC+3
Сравнение временных меток

Прямое сравнение float значений может давать неточные результаты из-за особенностей представления чисел с плавающей точкой.

$t1 = gettimeofday(true);
$t2 = $t1 + 0.000001;
var_dump($t1 == $t2); // Может вернуть true из-за округления
bool(true)
Изменения в версиях PHP
PHP 8.0

В PHP 8.0 функция не претерпела значительных изменений. Однако, улучшена общая производительность и стабильность работы с временными функциями.

PHP 7.1

С версии PHP 7.1.0 параметр $return_float стал необязательным и по умолчанию равен false. В более ранних версиях он требовался явно.

Исторические изменения

До PHP 5.1.0 функция всегда возвращала массив, а параметр $return_float отсутствовал. Добавление параметра произошло для совместимости с аналогичными функциями в других языках.

Расширенные примеры
Генерация уникального идентификатора
Пример php
function generateUniqueId() {
    $time = gettimeofday();
    return sprintf('%d%06d', $time['sec'], $time['usec']);
}
echo generateUniqueId();
1700000000123456
Измерение времени выполнения с точностью
Пример php
function measureClosure($callback) {
    $start = gettimeofday(true);
    $result = $callback();
    $end = gettimeofday(true);
    return [
        'result' => $result,
        'time' => $end - $start
    ];
}

$data = measureClosure(function() {
    return array_sum(range(1, 100000));
});
print_r($data);
Array
(
    [result] => 5000050000
    [time] => 0.012345
)
Создание временной метки для логов
Пример php
function getLogTimestamp() {
    $time = gettimeofday();
    $micro = sprintf('%06d', $time['usec']);
    $date = date('Y-m-d H:i:s.', $time['sec']);
    return $date . $micro;
}
echo getLogTimestamp();
2023-11-14 12:34:56.123456
Синхронизация с учетом микросекунд
Пример php
function syncOperation() {
    $current = gettimeofday();
    $targetSec = $current['sec'] + 1;
    $targetUsec = 500000; // Полсекунды
    
    do {
        $now = gettimeofday();
        $diff = ($targetSec - $now['sec']) * 1000000 
                + ($targetUsec - $now['usec']);
    } while ($diff > 0);
    
    echo 'Синхронизация выполнена';
}
Синхронизация выполнена
Анализ временных зон
Пример php
function getTimezoneInfo() {
    $time = gettimeofday();
    $hours = -$time['minuteswest'] / 60;
    $dst = $time['dsttime'] ? 'Действует летнее время' : 'Летнее время отсутствует';
    return sprintf('UTC%s%.1f, %s', 
        $hours >= 0 ? '+' : '',
        $hours,
        $dst
    );
}
echo getTimezoneInfo();
UTC+3.0, Летнее время отсутствует

PHP gettimeofday function comments

En
Gettimeofday Get current time