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

Дерево руководства
Глава 89 · Практика
HRTime: секундомер, тики и измерение этапов
Полная ветка внешнего HRTime: все классы и методы, единицы, несколько интервалов, границы измерения и отличие от core hrtime.
Измерить работу: что показывает секундомер
Замерить только нужные интервалы работы
Объект Stopwatch из дополнительного расширения HRTime накапливает законченные интервалы. Обычная функция hrtime() доступна отдельно в PHP.
- 1start()↓
Запомнить начало первого участка обработки.
- 2Работа → stop()↓
Первый законченный интервал добавлен к общей длительности.
- 3Пауза вне замера↓
Пока секундомер остановлен, время паузы не прибавляется.
- 4start → работа → 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(...) передаёт ошибку вместо продолжения с отсутствующей отметкой; это отдельный путь исключения. Массивы; Исключения.
- Отметка до array_sum
- array_sum получает 120, 80, 50 и возвращает 250
- Отметка после расчёта
- Разность отметок — длительность; результат операции отдельно
<?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 и расширений.
- PHP 8.5.11 содержит core hrtime()
- Для StopWatch отдельно загружается DLL hrtime
- extension_loaded + class_exists проверяют это окружение
- Код с 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 начинает новый интервал, сохраняя уже накопленное.
- start → обработка первого блока → stop
- Подготовка между интервалами не измеряется
- start → обработка второго блока → stop
- 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 восстанавливает обработчик даже при ошибке. Область видимости и ссылки; Обработка ошибок.
- start уже включил таймер
- Второй start выдаёт предупреждение
- isRunning остаётся true
- Один 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 или только расчёт? Сделайте прогрев, несколько измерений, сохраните объём данных и окружение. Один короткий запуск зависит от кеша, планировщика и накладных расходов самого таймера.
- Одинаковые входы и проверенный результат
- Несколько повторений одинаковых границ
- Длительности и единицы сохраняются отдельно от вывода
- Сравнивают распределение, затем ищут причину профилировщиком
<?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. Диагностика совместимости и границы проверки.
- Берём исходный счётчик
- Выполняем небольшой расчёт
- Вычитаем показания; делим на частоту
- Получаем длительность, не дату
<?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. Диагностика совместимости и границы проверки.
- getFrequency читает масштаб счётчика
- Положительное число ticks/sec
- Этот масштаб используется в делении интервала
<?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. Диагностика совместимости и границы проверки.
- Отметка до операции
- Операция создаёт результат
- Отметка после операции
- Вычитаем начало из конца
<?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. Диагностика совместимости и границы проверки.
- Сохраняем getTicks() в $start
- Проверяем три элемента
- 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. Диагностика совместимости и границы проверки.
- Новый секундомер: 0 завершённых интервалов
- start → обработка → stop
- Накопленный результат доступен; объект остановлен
<?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. Диагностика совместимости и границы проверки.
- Новый объект остановлен
- start фиксирует исходный tick
- isRunning становится true
<?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. Диагностика совместимости и границы проверки.
- Объект измеряет интервал
- stop снимает конец и прибавляет разность
- isRunning становится false; возвращаемое значение null
<?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. Диагностика совместимости и границы проверки.
- Новый объект → false
- start → true
- 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::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. Диагностика совместимости и границы проверки.
- Новый секундомер: результат 0
- start → сумма 2+3 → stop
- 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. Диагностика совместимости и границы проверки.
- Новый секундомер: результат 0
- start → сумма 2+3 → stop
- 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. Диагностика совместимости и границы проверки.
- Новый секундомер: результат 0
- start → сумма 2+3 → stop
- 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. Диагностика совместимости и границы проверки.
- Новый секундомер: результат 0
- start → сумма 2+3 → stop
- 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. Диагностика совместимости и границы проверки.
- Нужна подпись миллисекунд
- HRTime\Unit::MILLISECOND имеет значение 1
- Это режим преобразования сохранённого интервала
<?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.
Источники и обсуждения
- PHP: book.hrtime
- PHP: hrtime.setup
- PHP: hrtime.installation
- PHP: hrtime.examples
- PHP: hrtime.example.basic
- PHP: class.hrtime-performancecounter
- PHP: class.hrtime-stopwatch
- PHP: class.hrtime-unit
- PHP: hrtime-performancecounter.getfrequency
- PHP: hrtime-performancecounter.getticks
- PHP: hrtime-performancecounter.gettickssince
- PHP: hrtime-stopwatch.getelapsedticks
- PHP: hrtime-stopwatch.getelapsedtime
- PHP: hrtime-stopwatch.getlastelapsedticks
- PHP: hrtime-stopwatch.getlastelapsedtime
- PHP: hrtime-stopwatch.isrunning
- PHP: hrtime-stopwatch.start
- PHP: hrtime-stopwatch.stop
- PECL: releases and source
- Windows DLL compatibility
- Implementation examined
- Отдельная core hrtime()
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


