Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 89 · Практика

HRTime: секундомер, тики и измерение этапов

Полная ветка внешнего HRTime: все классы и методы, единицы, несколько интервалов, границы измерения и отличие от core hrtime.

Измерить работу: что показывает секундомер

Наглядная модель

Замерить только нужные интервалы работы

Объект Stopwatch из дополнительного расширения HRTime накапливает законченные интервалы. Обычная функция hrtime() доступна отдельно в PHP.

  1. start()

    Запомнить начало первого участка обработки.

  2. Работа → stop()

    Первый законченный интервал добавлен к общей длительности.

  3. Пауза вне замера

    Пока секундомер остановлен, время паузы не прибавляется.

  4. start → работа → stop

    Второй интервал добавлен к сумме. getElapsedTime с явной единицей отдаёт накопленное время.

Не путайте ticks, единицу измерения и точность. Условия совместимости PECL HRTime и диагностические сообщения проверенной сборки разобраны в главе.

Импорт товаров уже выдаёт правильный результат. Теперь нужно понять, сколько времени занимает разбор одного блока и два блока вместе, исключив паузу между ними. Секундомер сохраняет границы выполнения; он не ускоряет операцию и не завершает её сам.

ИнструментЧто доступноКогда выбирать
Встроенная hrtime()С PHP 7.3, без внешнего HRTime. Возвращает монотонное время от произвольной точки.Один участок: конечная отметка минус начальная.
PECL HRTime\StopWatchВнешнее расширение: объект с start/stop и суммой интервалов.Проект уже использует расширение или нужен именно его API нескольких интервалов.
time()/DateTimeКалендарная дата и часовой пояс.Когда случилось событие; это не то же самое, что измерение длительности.

Сначала доступный без установки минимальный опыт. $start — переменная, = сохраняет результат; hrtime(true) просит число наносекунд; вычитание даёт длительность, деление на 1000000 переводит её в миллисекунды. Успех вызова проверяют строго через === false. Переменные.

Запись [120, 80, 50] создаёт массив чисел; array_sum возвращает их сумму. if (...) { ... } выполняет действие при верном условии; || объединяет варианты отказа. throw new RuntimeException(...) передаёт ошибку вместо продолжения с отсутствующей отметкой; это отдельный путь исключения. Массивы; Исключения.

Измеряем только свой расчёт
  1. Отметка до array_sum
  2. array_sum получает 120, 80, 50 и возвращает 250
  3. Отметка после расчёта
  4. Разность отметок — длительность; результат операции отдельно
Первый опыт со встроенной функциейСамостоятельный пример
<?php
$start = hrtime(true);
$sum = array_sum([120, 80, 50]);
$end = hrtime(true);
if ($start === false || $end === false) { throw new RuntimeException('Timer unavailable'); }
$milliseconds = ($end - $start) / 1000000;
echo $sum, "\n";
var_dump($milliseconds >= 0);
Ожидаемый результат
250
bool(true)

Точная длительность меняется между запусками: ожидаемый вывод проверяет смысл измерения, не обещает выдуманные 0.01 мс. || означает «хотя бы один отказ»; throw передаёт ошибку, если платформа не дала таймер.

Модель секундомера не является моделью памяти PHP. Между отметками учитываются ожидание ОС и работа вызываемых операций, но не код вне этих границ. Число наносекунд не гарантирует точность в одну наносекунду. Встроенная функция и PECL-счётчик имеют разные единицы/реализации; вычитать одно из другого нельзя.

Установка, версии и что здесь действительно проверено

HRTime — отдельное PECL-расширение, не встроенный класс PHP и не пакет Composer. Официальная карточка пакета содержит исходники, журнал версий и Windows DLL. Современный API в этой главе соответствует 0.6.0; у него в журнале есть перенос start/stop/elapsed/isRunning из PerformanceCounter в StopWatch и два новых метода getTicks/getTicksSince.

Для Windows выбирают DLL под версию PHP, NTS/TS, архитектуру и toolchain; проверяют загрузку именно используемым CLI/FPM/веб-SAPI. Для исходной сборки следуют общей инструкции установки PECL-расширений. Наличие core hrtime() не доказывает наличие классов HRTime. Установка PHP и расширений.

Наличие функции не гарантирует наличие класса
  1. PHP 8.5.11 содержит core hrtime()
  2. Для StopWatch отдельно загружается DLL hrtime
  3. extension_loaded + class_exists проверяют это окружение
  4. Код с new StopWatch запускают после подтверждения
Проверить именно внешний пакетПример для указанного окружения
<?php
var_dump(extension_loaded('hrtime'));
var_dump(class_exists('HRTime\StopWatch'));
echo phpversion('hrtime'), "\n";
Ожидаемый результат
bool(true)
bool(true)
0.6.0

Ожидаемый результат относится к изолированному окружению с DLL 0.6.0. В обычном PHP пакет может отсутствовать; function_exists("hrtime") отвечает на другой вопрос.

Фактическая проверка партии: официальная DLL hrtime 0.6.0 для PHP 8.5 NTS VS17 x64 загружена в отдельный процесс PHP 8.5.11. При старте она выдаёт 10 предупреждений Missing arginfo у методов. Они сохранены в отчёте; эту загрузку нельзя называть чистой совместимостью с PHP 8.5. Общий php.ini проекта не менялся. Контекстные примеры отдельно исполнены с этой DLL, а в общем переносимом наборе остаются режимом lint с требованием hrtime.

В изученном исходнике optional unit у time-getters не инициализирован до разбора аргументов. Хотя manual указывает default SECOND, все примеры передают единицу явно. Не отключайте предупреждения глобально ради старого расширения на боевом сервере; сначала решите вопрос совместимости. Для нового простого замера core hrtime обычно снимает необходимость в дополнительном пакете.

Два этапа импорта: включённое и исключённое время

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

Один объект хранит общую сумму и последний завершённый интервал. После stop можно выполнить работу, которую не нужно включать: подготовить экран, дождаться очереди или обработать другой блок отдельно. Следующий start начинает новый интервал, сохраняя уже накопленное.

Что входит в итог
  1. start → обработка первого блока → stop
  2. Подготовка между интервалами не измеряется
  3. start → обработка второго блока → stop
  4. total = первый + второй; last = только второй
Проверить состав накопленной длительностиПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start();
$firstResult = array_sum([5, 10]);
$watch->stop();
$firstTicks = $watch->getLastElapsedTicks();
$caption = 'Report';
$watch->start();
$secondResult = array_sum([20, 30]);
$watch->stop();
$secondTicks = $watch->getLastElapsedTicks();
echo $caption, ': ', $firstResult + $secondResult, "\n";
var_dump($watch->getElapsedTicks() === $firstTicks + $secondTicks);
Ожидаемый результат
Report: 65
bool(true)

Строка caption построена вне измеряемых интервалов. Точное время не фиксируем, но равенство суммы проверяет именно состав метрики.

Реальный импорт дополнительно обрабатывает отказ API/базы, а замер закрывают в finally. Для вложенных этапов берут отдельные объекты; повторный start того же объекта не создаёт вложенную секцию. Между независимыми запросами не переносите сырое состояние секундомера.

Предупреждения и состояние: сначала завершить, затем читать

Документация методов короткая; реализация 0.6.0 добавляет существенные правила. Повторный start предупреждает и сохраняет исходное начало. Stop остановленного таймера предупреждает и ничего не добавляет. GetElapsedTicks при running предупреждает, но возвращает прошлую сумму; getLastElapsedTicks при running предупреждает и возвращает 0. Time-getters читают сохранённые закрытые интервалы. Поэтому обычный маршрут один: start → работа → stop → чтение.

set_error_handler временно устанавливает функцию обработки предупреждения. В ней проверяют категорию E_WARNING; true означает «обработано». use (&$warnings) даёт функции доступ к внешнему счётчику по ссылке. finally восстанавливает обработчик даже при ошибке. Область видимости и ссылки; Обработка ошибок.

Исследуем ошибочный повторный старт
  1. start уже включил таймер
  2. Второй start выдаёт предупреждение
  3. isRunning остаётся true
  4. Один stop закрывает исходный интервал
Поймать ожидаемые нарушения состоянияПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$warnings = 0;
set_error_handler(function ($level) use (&$warnings) {
    if ($level !== E_WARNING) { return false; }
    $warnings++;
    return true;
});
try {
    $watch->start();
    $watch->start();
    var_dump($watch->getLastElapsedTicks());
    $watch->stop();
    $watch->stop();
} finally { restore_error_handler(); }
echo $warnings, "\n";
var_dump($watch->isRunning());
Ожидаемый результат
int(0)
3
bool(false)

Это диагностический опыт, не способ штатного управления. Три ожидаемых предупреждения: повторный start, lastTicks во время running, повторный stop. Startup Missing arginfo происходит раньше пользовательского обработчика и учтён отдельно.

Чтение во время нового интервала не показывает его длительностьПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); array_sum([2, 4]); $watch->stop();
$closed = $watch->getElapsedTicks();
$lastMilliseconds = $watch->getLastElapsedTime(HRTime\Unit::MILLISECOND);
$watch->start();
$warnings = 0;
set_error_handler(function ($level) use (&$warnings) {
    if ($level !== E_WARNING) { return false; }
    $warnings++;
    return true;
});
try {
    var_dump($watch->getElapsedTicks() === $closed);
    var_dump($watch->getLastElapsedTicks() === 0);
    var_dump($watch->getLastElapsedTime(HRTime\Unit::MILLISECOND) === $lastMilliseconds);
} finally { restore_error_handler(); $watch->stop(); }
echo $warnings, "\n";
Ожидаемый результат
bool(true)
bool(true)
bool(true)
2

В 0.6.0 два tick-getter предупреждают; total отдаёт предыдущую сумму, lastTicks — 0. Time-getter без предупреждения отдаёт предыдущий завершённый интервал. Похожее название не делает все варианты одинаковыми. Для обычного отчёта читайте после stop.

Не подменяйте секундомером timeout или отмену. Проверка isRunning сообщает только состояние таймера. Если внешний процесс продолжает работу асинхронно, stop после запуска измерит запуск; для полного времени нужно дождаться реального результата. Процессы, ожидание и exit status.

Сделать измерение полезным, а не получить красивое случайное число

Прежде чем сравнивать два способа обработки, проверьте одинаковый результат на одинаковом наборе данных. Выберите границы: включает ли метрика чтение файла, открытие соединения, закрытие ZIP или только расчёт? Сделайте прогрев, несколько измерений, сохраните объём данных и окружение. Один короткий запуск зависит от кеша, планировщика и накладных расходов самого таймера.

Честное сравнение
  1. Одинаковые входы и проверенный результат
  2. Несколько повторений одинаковых границ
  3. Длительности и единицы сохраняются отдельно от вывода
  4. Сравнивают распределение, затем ищут причину профилировщиком
Не включать форматирование отчёта в измеряемый расчётСамостоятельный пример
<?php
$start = hrtime(true);
$total = 0;
foreach ([120, 80, 50] as $price) { $total += $price; }
$finish = hrtime(true);
if ($start === false || $finish === false) { throw new RuntimeException('Timer unavailable'); }
$report = ['total' => $total, 'nanoseconds' => $finish - $start];
echo $report['total'], "\n";
var_dump($report['nanoseconds'] >= 0);
Ожидаемый результат
250
bool(true)

foreach получает цены по очереди, += прибавляет к сумме. Отчёт строится после конечной отметки. Это демонстрация границ, а не доказательство преимущества цикла над array_sum.

Упражнение: оберните оба блока раздела выше разными StopWatch, затем отдельным общим. Объясните, почему сумма двух отдельных замеров может быть меньше общего: в общий входят промежуточные действия и накладные расходы. Не округляйте длительности до целых миллисекунд перед суммированием. Сырые ticks не записывают как общесистемный ключ сортировки событий; для этого нужны отдельные ID и календарные timestamps. Измерение производительности.

Все классы и методы HRTime

ВходНазначение
HRTime\PerformanceCounterДля измерения одного участка достаточно двух показаний счётчика. Этот класс даёт исходные ticks и частоту, чтобы перевести разницу в секунды.
HRTime\PerformanceCounter::getFrequencyПеревести аппаратные тики в понятные секунды можно, только зная число тиков в секунде.
HRTime\PerformanceCounter::getTicksСнять начальную отметку перед построением отчёта и конечную после него. Измерение задают границы участка кода.
HRTime\PerformanceCounter::getTicksSinceКогда начальная отметка уже сохранена, метод сам снимает текущее показание и отдаёт разность.
HRTime\StopWatchИмпорт разбит на два обрабатываемых блока; паузу между ними учитывать не нужно. Объект суммирует завершённые участки start→stop.
HRTime\StopWatch::startНачать измерение участка; при повторном использовании продолжить накопление.
HRTime\StopWatch::stopЗакончить текущий участок, чтобы его длительность вошла в итог.
HRTime\StopWatch::isRunningПеред остановкой таймера узнать, начат ли у этого экземпляра незакрытый интервал.
HRTime\StopWatch::getElapsedTicksПрочитать общую длительность выбранных этапов в исходных тиках счётчика.
HRTime\StopWatch::getLastElapsedTicksПрочитать длительность последнего этапа в исходных тиках счётчика.
HRTime\StopWatch::getElapsedTimeПрочитать общую длительность выбранных этапов в понятной единице времени.
HRTime\StopWatch::getLastElapsedTimeПрочитать длительность последнего этапа в понятной единице времени.
HRTime\UnitЕдиница отвечает на вопрос, что означает число в отчёте: секунды, миллисекунды, микросекунды или наносекунды.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

HRTime\PerformanceCounterДля измерения одного участка достаточно двух показаний счётчика. Этот класс даёт исходные ticks и частоту, чтобы перевести разницу в секунды.

PECL hrtime 0.4.3+ · hrtime

class HRTime\PerformanceCounter { public static getFrequency(): int; public static getTicks(): int; public static getTicksSince(int $start): int; }

Для измерения одного участка достаточно двух показаний счётчика. Этот класс даёт исходные ticks и частоту, чтобы перевести разницу в секунды.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
МодельНизкоуровневые статические методы, отдельный объект не нужен. Числа относятся к системному счётчику, не календарной дате.
Единицыticks не обязаны быть наносекундами: секунды = разница ticks / ticks_per_second.
ВерсииКласс существовал в 0.4.3; getTicks/getTicksSince и современное распределение методов — с 0.6.0. В 0.6 start/stop/elapsed/isRunning перенесены в StopWatch, getFrequency стал static.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Берём исходный счётчик
  2. Выполняем небольшой расчёт
  3. Вычитаем показания; делим на частоту
  4. Получаем длительность, не дату
Измерить расчёт суммыПример для указанного окружения
<?php
$start = HRTime\PerformanceCounter::getTicks();
$sum = array_sum([120, 80, 50]);
$ticks = HRTime\PerformanceCounter::getTicksSince($start);
$seconds = $ticks / HRTime\PerformanceCounter::getFrequency();
echo $sum, "\n";
var_dump($seconds >= 0);
Ожидаемый результат
250
bool(true)

array_sum выполняет измеряемую работу. Точное число секунд зависит от машины, поэтому проверяем смысл: результат задачи 250 и неотрицательная длительность.

Перевести один интервал в два масштабаПример для указанного окружения
<?php
$start = HRTime\PerformanceCounter::getTicks();
str_repeat('item;', 100);
$delta = HRTime\PerformanceCounter::getTicks() - $start;
$frequency = HRTime\PerformanceCounter::getFrequency();
$seconds = $delta / $frequency;
$milliseconds = $seconds * 1000;
var_dump($delta >= 0, $milliseconds >= $seconds);
Ожидаемый результат
bool(true)
bool(true)

Это те же измеренные ticks, а не два разных запуска. str_repeat создаёт короткий текст; здесь он нужен как независимый участок работы.

Практика и границы. Сохраняйте разницу, единицу и описание операции. Не используйте абсолютные ticks как ID сообщения или общую отметку между серверами/перезапусками.

Рядом: HRTime\PerformanceCounter::getTicks, HRTime\PerformanceCounter::getTicksSince, HRTime\PerformanceCounter::getFrequency, HRTime\StopWatch.

Маршрут от задачи к измерению.

HRTime\PerformanceCounter::getFrequencyПеревести аппаратные тики в понятные секунды можно, только зная число тиков в секунде.

PECL hrtime 0.4.3+ · hrtime

public static function getFrequency(): int

Перевести аппаратные тики в понятные секунды можно, только зная число тиков в секунде.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
ПараметрыНет.
Возвратint: ticks в секунду. Для почти всех ОС постоянен после запуска системы, но не задавайте одинаковую константу для всех платформ.
ОшибкаДокументация не задаёт отдельного false/исключения этого метода; инициализация внутреннего таймера может не дать расширению загрузиться.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. getFrequency читает масштаб счётчика
  2. Положительное число ticks/sec
  3. Этот масштаб используется в делении интервала
Узнать масштаб доступного счётчикаПример для указанного окружения
<?php
$frequency = HRTime\PerformanceCounter::getFrequency();
var_dump(is_int($frequency), $frequency > 0);
Ожидаемый результат
bool(true)
bool(true)

Не печатаем заранее выдуманную частоту: она зависит от платформы.

Показать миллисекунды завершённой операцииПример для указанного окружения
<?php
$start = HRTime\PerformanceCounter::getTicks();
$count = count([10, 20, 30]);
$delta = HRTime\PerformanceCounter::getTicksSince($start);
$milliseconds = 1000 * $delta / HRTime\PerformanceCounter::getFrequency();
echo $count, "\n";
var_dump($milliseconds >= 0);
Ожидаемый результат
3
bool(true)

Для отчёта можно вывести $milliseconds; точное значение не является ожидаемой константой теста.

Практика и границы. Разрешение счётчика и точность конкретного опыта не равны выбранной единице. Наносекундная подпись не устраняет шум планировщика и накладные расходы.

Рядом: HRTime\PerformanceCounter::getTicks, HRTime\StopWatch::getElapsedTime.

Маршрут от задачи к измерению.

HRTime\PerformanceCounter::getTicksСнять начальную отметку перед построением отчёта и конечную после него. Измерение задают границы участка кода.

PECL hrtime 0.6.0+ · hrtime

public static function getTicks(): int

Снять начальную отметку перед построением отчёта и конечную после него. Измерение задают границы участка кода.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

if (условие) { ... } выбирает действие; foreach проходит по элементам массива. function ... { return ...; } объявляет повторяемую операцию и отдаёт результат. Вызов и результат; Массив.

ДоговорЗначение
ПараметрыНет.
Возвратint: текущее показание платформенного счётчика. Это не секунды Unix и не готовая длительность.
Условие сравненияОбе отметки должны происходить из этого же счётчика и согласованного окружения. Не смешивайте с core hrtime(true), даже если числа похожи.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Отметка до операции
  2. Операция создаёт результат
  3. Отметка после операции
  4. Вычитаем начало из конца
Отделить показания от длительностиПример для указанного окружения
<?php
$before = HRTime\PerformanceCounter::getTicks();
$text = implode(',', ['red', 'green']);
$after = HRTime\PerformanceCounter::getTicks();
echo $text, "\n";
var_dump($after >= $before);
Ожидаемый результат
red,green
bool(true)

implode собирает результат; сравнение не требует, чтобы соседние показания обязательно различались.

Измерить вызов повторяемой операцииПример для указанного окружения
<?php
function buildLine($items) { return implode(';', $items); }
$start = HRTime\PerformanceCounter::getTicks();
$line = buildLine(['sku-1', 'sku-2']);
$elapsed = HRTime\PerformanceCounter::getTicks() - $start;
echo $line, "\n";
var_dump($elapsed >= 0);
Ожидаемый результат
sku-1;sku-2
bool(true)

Если перенести старт внутрь buildLine, подготовка аргументов окажется вне измерения. Положение границ — часть договора метрики.

Практика и границы. Счётчик не является устойчивой меткой календарного события. На 32-bit представление int требует отдельной проверки диапазона; эта партия исполнена на x64.

Рядом: HRTime\PerformanceCounter::getTicksSince, HRTime\PerformanceCounter::getFrequency.

Маршрут от задачи к измерению.

HRTime\PerformanceCounter::getTicksSinceКогда начальная отметка уже сохранена, метод сам снимает текущее показание и отдаёт разность.

PECL hrtime 0.6.0+ · hrtime

public static function getTicksSince(int $start): int

Когда начальная отметка уже сохранена, метод сам снимает текущее показание и отдаёт разность.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
startРанее полученный getTicks() этого счётчика. Не timestamp, не миллисекунды и не показание чужого сервера.
Возвратint: ticks между переданным стартом и вызовом метода. Не сбрасывает старт и не создаёт StopWatch.
Ошибка примененияБудущий/чужой start не валидируется как корректное событие: разность теряет смысл и может переполниться.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Сохраняем getTicks() в $start
  2. Проверяем три элемента
  3. getTicksSince($start) возвращает прошедшие ticks
Передать исходную отметкуПример для указанного окружения
<?php
$start = HRTime\PerformanceCounter::getTicks();
$valid = count(['a', 'b', 'c']) === 3;
$ticks = HRTime\PerformanceCounter::getTicksSince($start);
var_dump($valid, $ticks >= 0);
Ожидаемый результат
bool(true)
bool(true)

=== сравнивает значение и тип. Здесь три элемента — полезный результат проверки, а ticks — отдельная метрика.

Две контрольные точки от одного началаПример для указанного окружения
<?php
$start = HRTime\PerformanceCounter::getTicks();
str_repeat('a', 100);
$first = HRTime\PerformanceCounter::getTicksSince($start);
str_repeat('b', 200);
$second = HRTime\PerformanceCounter::getTicksSince($start);
var_dump($first >= 0, $second >= $first);
Ожидаемый результат
bool(true)
bool(true)

Вторая величина содержит и первый участок: для отдельного второго этапа сохраните новую начальную отметку.

Практика и границы. Это измерение прошедшего времени, а не жёсткий timeout. Если проверять бюджет после блокирующего вызова, уже потраченное время вернуть нельзя.

Рядом: HRTime\PerformanceCounter::getTicks, HRTime\PerformanceCounter::getFrequency, HRTime\StopWatch.

Маршрут от задачи к измерению.

HRTime\StopWatchИмпорт разбит на два обрабатываемых блока; паузу между ними учитывать не нужно. Объект суммирует завершённые участки start→stop.

PECL hrtime 0.4.3+ · hrtime

class HRTime\StopWatch extends HRTime\PerformanceCounter { start(): void; stop(): void; isRunning(): bool; getElapsedTicks(): int; getLastElapsedTicks(): int; getElapsedTime(int $unit = HRTime\Unit::SECOND): float; getLastElapsedTime(int $unit = HRTime\Unit::SECOND): float; }

Импорт разбит на два обрабатываемых блока; паузу между ними учитывать не нужно. Объект суммирует завершённые участки start→stop.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
СостояниеНовый объект остановлен, накопление 0. start начинает интервал; stop закрывает и прибавляет его. Новый start продолжает накопление.
НаследованиеДоступны три статических метода PerformanceCounter; они не начинают интервал конкретного объекта.
СбросВ официальном API нет reset. Новый независимый замер — новый объект.
ВерсияСовременное размещение методов в StopWatch соответствует 0.6.0; более старые примеры могли вызывать их у PerformanceCounter.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый секундомер: 0 завершённых интервалов
  2. start → обработка → stop
  3. Накопленный результат доступен; объект остановлен
Измерить один блок и прочитать состояниеПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start();
$sum = array_sum([8, 12]);
$watch->stop();
echo $sum, "\n";
var_dump($watch->isRunning(), $watch->getElapsedTicks() >= 0);
Ожидаемый результат
20
bool(false)
bool(true)

Сам таймер не выполняет сумму: он обрамляет ваш код и хранит измерение.

Сложить два участка, исключив промежутокПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); array_sum([1, 2]); $watch->stop();
$first = $watch->getLastElapsedTicks();
str_repeat('outside;', 20);
$watch->start(); array_sum([3, 4]); $watch->stop();
$last = $watch->getLastElapsedTicks();
var_dump($watch->getElapsedTicks() === $first + $last);
$fresh = new HRTime\StopWatch();
echo $fresh->getElapsedTicks(), "\n";
Ожидаемый результат
bool(true)
0

str_repeat находится между stop и новым start, поэтому не входит в накопленную длительность. Новый объект имеет своё состояние.

Практика и границы. Один экземпляр не измеряет вложенные участки: повторный start не создаёт стек. Для вложенных/одновременных операций используйте отдельные экземпляры.

Рядом: HRTime\StopWatch::start, HRTime\StopWatch::stop, HRTime\StopWatch::getElapsedTime.

Маршрут от задачи к измерению.

HRTime\StopWatch::startНачать измерение участка; при повторном использовании продолжить накопление.

PECL hrtime 0.4.3+ · hrtime

public function start(): void

Начать измерение участка; при повторном использовании продолжить накопление.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
ПараметрыНет.
Возвратvoid: полезного значения нет; при присваивании наблюдается null.
СостояниеПосле старта isRunning=true. Повторный start не перезапускает интервал и в реализации 0.6.0 выдаёт E_WARNING.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый объект остановлен
  2. start фиксирует исходный tick
  3. isRunning становится true
Изменение состояния и значение voidПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
var_dump($watch->isRunning());
$result = $watch->start();
var_dump($result, $watch->isRunning());
$watch->stop();
Ожидаемый результат
bool(false)
NULL
bool(true)

Проверяем состояние через isRunning; результат самого start/stop не является временем.

Продолжить накопление без сбросаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); $watch->stop();
$before = $watch->getElapsedTicks();
$watch->start(); $watch->stop();
var_dump($watch->getElapsedTicks() >= $before);
Ожидаемый результат
bool(true)

Повторная пара start/stop добавляет отдельный интервал. Для сброса создают новый объект.

Практика и границы. Перед условным вызовом используйте isRunning. Не подавляйте предупреждения операторами @; лучше соблюсти состояние.

Рядом: HRTime\StopWatch::isRunning, HRTime\StopWatch::getElapsedTicks, HRTime\StopWatch::stop.

Маршрут от задачи к измерению.

HRTime\StopWatch::stopЗакончить текущий участок, чтобы его длительность вошла в итог.

PECL hrtime 0.4.3+ · hrtime

public function stop(): void

Закончить текущий участок, чтобы его длительность вошла в итог.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

try { ... } finally { ... } выполняет уборку даже при исключении; catch получает ошибку. Обработчик set_error_handler в специальном опыте ловит ожидаемое предупреждение, после него прежний обработчик восстанавливают. Исключения и finally.

ДоговорЗначение
ПараметрыНет.
Возвратvoid: полезного значения нет; при присваивании наблюдается null.
СостояниеПосле stop isRunning=false, интервал прибавлен в total и сохранён как last. Stop уже остановленного объекта в 0.6.0 выдаёт E_WARNING, состояние не меняет.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Объект измеряет интервал
  2. stop снимает конец и прибавляет разность
  3. isRunning становится false; возвращаемое значение null
Изменение состояния и значение voidПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start();
$result = $watch->stop();
var_dump($result, $watch->isRunning());
Ожидаемый результат
NULL
bool(false)

Проверяем состояние через isRunning; результат самого start/stop не является временем.

Закрыть замер при исключении обработкиПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start();
try {
    try { throw new RuntimeException('broken record'); }
    finally { $watch->stop(); }
} catch (RuntimeException $error) { echo "record rejected\n"; }
var_dump($watch->isRunning());
Ожидаемый результат
record rejected
bool(false)

finally закрывает замер, даже если обработка записи не закончилась. Само исключение остаётся задачей внешнего catch.

Практика и границы. Перед условным вызовом используйте isRunning. Не подавляйте предупреждения операторами @; лучше соблюсти состояние.

Рядом: HRTime\StopWatch::isRunning, HRTime\StopWatch::getElapsedTicks, HRTime\StopWatch::start.

Маршрут от задачи к измерению.

HRTime\StopWatch::isRunningПеред остановкой таймера узнать, начат ли у этого экземпляра незакрытый интервал.

PECL hrtime 0.4.3+ · hrtime

public function isRunning(): bool

Перед остановкой таймера узнать, начат ли у этого экземпляра незакрытый интервал.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

if (условие) { ... } выбирает действие; foreach проходит по элементам массива. function ... { return ...; } объявляет повторяемую операцию и отдаёт результат. Вызов и результат; Массив.

ДоговорЗначение
ПараметрыНет.
Возвратtrue между start и stop; false у нового или остановленного объекта. Метод не изменяет состояние.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый объект → false
  2. start → true
  3. stop → false
Прочитать три состоянияПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
var_dump($watch->isRunning());
$watch->start(); var_dump($watch->isRunning());
$watch->stop(); var_dump($watch->isRunning());
Ожидаемый результат
bool(false)
bool(true)
bool(false)

Это логический ответ, а не количество уже накопленных интервалов.

Закрыть таймер только если он был запущенПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
if ($watch->isRunning()) { $watch->stop(); }
$watch->start();
if ($watch->isRunning()) { $watch->stop(); }
var_dump($watch->isRunning());
Ожидаемый результат
bool(false)

Первая проверка предотвращает лишний stop нового таймера. Вторая действительно закрывает начатый интервал.

Практика и границы. Проверка одного объекта ничего не говорит о другом секундомере или о завершении асинхронной операции. Таймер показывает своё состояние, не статус внешнего запроса.

Рядом: HRTime\StopWatch::start, HRTime\StopWatch::stop.

Маршрут от задачи к измерению.

HRTime\StopWatch::getElapsedTicksПрочитать общую длительность выбранных этапов в исходных тиках счётчика.

PECL hrtime 0.4.3+ · hrtime

public function getElapsedTicks(): int

Прочитать общую длительность выбранных этапов в исходных тиках счётчика.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
ПараметрыНет.
Возвратint ticks суммы всех закрытых интервалов.
Начальное состояниеДо первого закрытого интервала результат 0 (0.0 для time).
Во время измеренияВ 0.6.0 E_WARNING и сумма только ранее закрытых интервалов.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый секундомер: результат 0
  2. start → сумма 2+3 → stop
  3. total хранит накопленный закрытый интервал
Прочитать результат до и после первого этапаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
var_dump($watch->getElapsedTicks());
$watch->start();
$sum = array_sum([2, 3]);
$watch->stop();
echo $sum, "\n";
var_dump($watch->getElapsedTicks() >= 0);
Ожидаемый результат
int(0)
5
bool(true)

Нулевой начальный результат — не ошибка. Для очень короткого участка нулевое измерение тоже возможно из-за разрешения счётчика.

Отличить последний этап от общего итогаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); array_sum([1, 2]); $watch->stop();
$first = $watch->getLastElapsedTicks();
$watch->start(); array_sum([3, 4]); $watch->stop();
$last = $watch->getLastElapsedTicks();
var_dump($watch->getElapsedTicks() === $first + $last);
Ожидаемый результат
bool(true)

Сумма двух интервалов равна total; last содержит только вторую пару start/stop.

Практика и границы. Ticks надо делить на getFrequency, прежде чем подписывать «секунды». Сначала stop, затем чтение: getter не останавливает измерение. Таймер показывает прошедшее время участка, включая ожидание ОС; он не является счётчиком чистого CPU.

Рядом: HRTime\StopWatch::stop, HRTime\PerformanceCounter::getFrequency, HRTime\Unit.

Маршрут от задачи к измерению.

HRTime\StopWatch::getLastElapsedTicksПрочитать длительность последнего этапа в исходных тиках счётчика.

PECL hrtime 0.4.3+ · hrtime

public function getLastElapsedTicks(): int

Прочитать длительность последнего этапа в исходных тиках счётчика.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
ПараметрыНет.
Возвратint ticks последнего закрытого интервала.
Начальное состояниеДо первого закрытого интервала результат 0 (0.0 для time).
Во время измеренияВ 0.6.0 E_WARNING и 0, пока таймер запущен.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый секундомер: результат 0
  2. start → сумма 2+3 → stop
  3. last хранит последний закрытый интервал
Прочитать результат до и после первого этапаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
var_dump($watch->getLastElapsedTicks());
$watch->start();
$sum = array_sum([2, 3]);
$watch->stop();
echo $sum, "\n";
var_dump($watch->getLastElapsedTicks() >= 0);
Ожидаемый результат
int(0)
5
bool(true)

Нулевой начальный результат — не ошибка. Для очень короткого участка нулевое измерение тоже возможно из-за разрешения счётчика.

Отличить последний этап от общего итогаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); array_sum([1, 2]); $watch->stop();
$first = $watch->getLastElapsedTicks();
$watch->start(); array_sum([3, 4]); $watch->stop();
$last = $watch->getLastElapsedTicks();
var_dump($watch->getLastElapsedTicks() === $last);
Ожидаемый результат
bool(true)

Сумма двух интервалов равна total; last содержит только вторую пару start/stop.

Практика и границы. Ticks надо делить на getFrequency, прежде чем подписывать «секунды». Сначала stop, затем чтение: getter не останавливает измерение. Таймер показывает прошедшее время участка, включая ожидание ОС; он не является счётчиком чистого CPU.

Рядом: HRTime\StopWatch::stop, HRTime\PerformanceCounter::getFrequency, HRTime\Unit.

Маршрут от задачи к измерению.

HRTime\StopWatch::getElapsedTimeПрочитать общую длительность выбранных этапов в понятной единице времени.

PECL hrtime 0.4.3+ · hrtime

public function getElapsedTime(int $unit = HRTime\Unit::SECOND): float

Прочитать общую длительность выбранных этапов в понятной единице времени.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
Параметрыunit — HRTime\Unit::SECOND (0, default по документации), MILLISECOND (1), MICROSECOND (2), NANOSECOND (3). В коде всегда передаём его явно.
Возвратfloat в выбранной единице суммы всех закрытых интервалов.
Начальное состояниеДо первого закрытого интервала результат 0 (0.0 для time).
Во время измеренияТекущий незакрытый участок не включается; time getter в 0.6.0 отдаёт прежнее сохранённое значение.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый секундомер: результат 0
  2. start → сумма 2+3 → stop
  3. total хранит накопленный закрытый интервал
Прочитать результат до и после первого этапаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
var_dump($watch->getElapsedTime(HRTime\Unit::MILLISECOND));
$watch->start();
$sum = array_sum([2, 3]);
$watch->stop();
echo $sum, "\n";
var_dump($watch->getElapsedTime(HRTime\Unit::MILLISECOND) >= 0);
Ожидаемый результат
float(0)
5
bool(true)

Нулевой начальный результат — не ошибка. Для очень короткого участка нулевое измерение тоже возможно из-за разрешения счётчика.

Сравнить единицы одного сохранённого измеренияПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); array_sum([1, 2]); $watch->stop();
$watch->start(); array_sum([3, 4]); $watch->stop();
$milliseconds = $watch->getElapsedTime(HRTime\Unit::MILLISECOND);
$seconds = $watch->getElapsedTime(HRTime\Unit::SECOND);
var_dump(abs($milliseconds - $seconds * 1000) < 0.000001);
Ожидаемый результат
bool(true)

abs берёт модуль разницы; небольшой допуск нужен из-за округления float. Оба вызова читают одно и то же сохранённое измерение, не замеряют заново.

Практика и границы. Документация задаёт default SECOND; у проверенного исходника 0.6.0 локальная unit не инициализирована до необязательного аргумента. Поэтому явная единица обязательна для надёжного примера. Неизвестный числовой unit в ветке switch попадает в секунды — не используйте это как валидацию. Таймер показывает прошедшее время участка, включая ожидание ОС; он не является счётчиком чистого CPU.

Рядом: HRTime\StopWatch::stop, HRTime\PerformanceCounter::getFrequency, HRTime\Unit.

Маршрут от задачи к измерению.

HRTime\StopWatch::getLastElapsedTimeПрочитать длительность последнего этапа в понятной единице времени.

PECL hrtime 0.4.3+ · hrtime

public function getLastElapsedTime(int $unit = HRTime\Unit::SECOND): float

Прочитать длительность последнего этапа в понятной единице времени.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
Параметрыunit — HRTime\Unit::SECOND (0, default по документации), MILLISECOND (1), MICROSECOND (2), NANOSECOND (3). В коде всегда передаём его явно.
Возвратfloat в выбранной единице последнего закрытого интервала.
Начальное состояниеДо первого закрытого интервала результат 0 (0.0 для time).
Во время измеренияТекущий незакрытый участок не включается; time getter в 0.6.0 отдаёт прежнее сохранённое значение.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Новый секундомер: результат 0
  2. start → сумма 2+3 → stop
  3. last хранит последний закрытый интервал
Прочитать результат до и после первого этапаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
var_dump($watch->getLastElapsedTime(HRTime\Unit::MILLISECOND));
$watch->start();
$sum = array_sum([2, 3]);
$watch->stop();
echo $sum, "\n";
var_dump($watch->getLastElapsedTime(HRTime\Unit::MILLISECOND) >= 0);
Ожидаемый результат
float(0)
5
bool(true)

Нулевой начальный результат — не ошибка. Для очень короткого участка нулевое измерение тоже возможно из-за разрешения счётчика.

Сравнить единицы одного сохранённого измеренияПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start(); array_sum([1, 2]); $watch->stop();
$watch->start(); array_sum([3, 4]); $watch->stop();
$milliseconds = $watch->getLastElapsedTime(HRTime\Unit::MILLISECOND);
$seconds = $watch->getLastElapsedTime(HRTime\Unit::SECOND);
var_dump(abs($milliseconds - $seconds * 1000) < 0.000001);
Ожидаемый результат
bool(true)

abs берёт модуль разницы; небольшой допуск нужен из-за округления float. Оба вызова читают одно и то же сохранённое измерение, не замеряют заново.

Практика и границы. Документация задаёт default SECOND; у проверенного исходника 0.6.0 локальная unit не инициализирована до необязательного аргумента. Поэтому явная единица обязательна для надёжного примера. Неизвестный числовой unit в ветке switch попадает в секунды — не используйте это как валидацию. Таймер показывает прошедшее время участка, включая ожидание ОС; он не является счётчиком чистого CPU.

Рядом: HRTime\StopWatch::stop, HRTime\PerformanceCounter::getFrequency, HRTime\Unit.

Маршрут от задачи к измерению.

HRTime\UnitЕдиница отвечает на вопрос, что означает число в отчёте: секунды, миллисекунды, микросекунды или наносекунды.

PECL hrtime 0.4.3+ · hrtime

class HRTime\Unit { const int SECOND = 0; const int MILLISECOND = 1; const int MICROSECOND = 2; const int NANOSECOND = 3; }

Единица отвечает на вопрос, что означает число в отчёте: секунды, миллисекунды, микросекунды или наносекунды.

Имя HRTime\StopWatch содержит пространство имён HRTime и класс StopWatch. $watch = new HRTime\StopWatch(); создаёт отдельный секундомер; = сохраняет его в переменную. $watch->start() вызывает действие именно этого экземпляра; круглые скобки содержат аргументы, пустые означают их отсутствие. HRTime\PerformanceCounter::getTicks() — статический вызов без экземпляра. HRTime\Unit::MILLISECOND — именованная целочисленная константа единицы. echo выводит, var_dump показывает значение с типом, "\n" переносит строку. Класс и объект; Пространства имён.

В сигнатуре int — целое, float — число с дробной частью, bool — true/false; void означает отсутствие полезного возвращаемого значения. Эти слова описывают договор метода, а не единицы времени.

ДоговорЗначение
КонстантыSECOND=0; MILLISECOND=1; MICROSECOND=2; NANOSECOND=3.
ИспользованиеАргумент getElapsedTime/getLastElapsedTime. Это класс констант, не enum и не секундомер; создавать объект не требуется.
Масштабы1 секунда = 1000 миллисекунд = 1000000 микросекунд = 1000000000 наносекунд. Масштаб вывода не обещает такую же точность измерения.

Примеры ниже требуют загруженного PECL hrtime 0.6.0 и совместимой сборки PHP. В общем окружении они проверяются как контекстные; отдельный реальный прогон этой партии выполнен с официальной Windows DLL. Диагностика совместимости и границы проверки.

Что делает первый опыт
  1. Нужна подпись миллисекунд
  2. HRTime\Unit::MILLISECOND имеет значение 1
  3. Это режим преобразования сохранённого интервала
Прочитать значения, не создавая объектПример для указанного окружения
<?php
echo HRTime\Unit::SECOND, "\n";
echo HRTime\Unit::MILLISECOND, "\n";
echo HRTime\Unit::MICROSECOND, "\n";
echo HRTime\Unit::NANOSECOND, "\n";
Ожидаемый результат
0
1
2
3

Значения 0…3 — селекторы, а не коэффициенты умножения. Для перевода секунд в миллисекунды множитель 1000, не 1.

Выбрать единицу до оформления отчётаПример для указанного окружения
<?php
$watch = new HRTime\StopWatch();
$watch->start();
$count = count(['row-1', 'row-2']);
$watch->stop();
$report = ['rows' => $count, 'milliseconds' => $watch->getElapsedTime(HRTime\Unit::MILLISECOND)];
echo $report['rows'], "\n";
var_dump($report['milliseconds'] >= 0);
Ожидаемый результат
2
bool(true)

Имя поля явно хранит единицу. При отправке метрики в API её не придётся угадывать по величине числа.

Практика и границы. Нельзя передавать Unit::NANOSECOND в getTicks: у него нет такого аргумента. Для самостоятельного пересчёта ticks нужны частота и масштаб, а не константа режима.

Рядом: HRTime\StopWatch::getElapsedTime, HRTime\StopWatch::getLastElapsedTime, HRTime\PerformanceCounter::getFrequency.

Маршрут от задачи к измерению.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.