time_nanosleep()
Функция PHP time_nanosleep(): синтаксис, параметры, возвращаемые значения и примеры использования.
В этой статье мы рассмотрим функцию PHP time_nanosleep(). Мы разберём её синтаксис, параметры и возвращаемые значения, приведём рабочие примеры, объясним, как обрабатывать прерывания, и укажем на связанные функции задержки.
Введение в функцию time_nanosleep()
Функция time_nanosleep() — встроенная функция PHP, которая приостанавливает выполнение скрипта на заданное число секунд и наносекунд. Благодаря точности до наносекунды это наиболее точный способ введения задержки в PHP — гораздо точнее, чем sleep(), которая принимает только целое число секунд.
Наносекунда — это одна миллиардная доля секунды (1e-9 s), поэтому 1000000000 наносекунд равны одной полной секунде. На практике реальная точность ограничена планировщиком операционной системы, однако функция позволяет запрашивать задержки меньше микросекунды.
time_nanosleep() основана на POSIX и недоступна в Windows по умолчанию.
Синтаксис
time_nanosleep(int $seconds, int $nanoseconds): array|boolПараметры
$seconds— количество целых секунд задержки. Должно быть неотрицательным целым числом.$nanoseconds— дополнительное количество наносекунд задержки в диапазоне от0до999999999. Значения1000000000и более вызывают предупреждение, и вызов завершается ошибкой.
Возвращаемые значения
- Возвращает
trueпри успехе. - Возвращает
falseпри ошибке (например, когда аргумент выходит за допустимый диапазон). - Если сон прерывается сигналом, функция возвращает ассоциативный массив с двумя ключами,
secondsиnanoseconds, содержащими оставшееся время сна. Это позволяет возобновить задержку с того места, где она была прервана.
Использование функции time_nanosleep()
Вызовите функцию, передав количество секунд и наносекунд задержки. Вот базовый пример:
В этом примере мы вызываем time_nanosleep() с 1 секундой и 500000000 наносекундами. Это приостанавливает скрипт на 1 секунду плюс 500 000 000 наносекунд (0,5 секунды), то есть в сумме на 1,5 секунды. Мы выводим сообщение до паузы, ждём указанное время, а затем выводим ещё одно сообщение по завершении.
Измерение фактической задержки
Поскольку планировщик ОС сам решает, когда именно возобновить процесс, реальная пауза не меньше запрошенной продолжительности, но может быть немного длиннее. Проверить это можно с помощью microtime():
Выведенное значение будет приблизительно равно 0.250 секунды (например, 0.250 или 0.251), что подтверждает запрошенную задержку в четверть секунды.
Возобновление после прерывания сигналом
Если сон прерывается сигналом, time_nanosleep() возвращает оставшееся время в виде массива вместо true. Можно использовать цикл до тех пор, пока вся задержка не истечёт:
При отсутствии обработчика сигналов тело цикла никогда не выполнится, однако это правильный паттерн для скриптов, регистрирующих обработчики сигналов с помощью расширения pcntl.
Особенности производительности
time_nanosleep() эффективна, поскольку опирается на планировщик ОС, а не на активное ожидание, и потому не потребляет процессорное время во время паузы. Учитывайте следующие моменты:
- Функция работает только на POSIX-системах и недоступна в Windows по умолчанию. В Windows используйте
usleep()для задержек с точностью до микросекунды. - При частых вызовах накладные расходы на переключение контекста могут накапливаться, поэтому используйте функцию только тогда, когда действительно требуется точность ниже секунды.
- Пауза является минимумом, а не точной гарантией — никогда не полагайтесь на неё для жёсткого реального времени.
Связанные функции
sleep()— приостановить выполнение на целое число секунд.usleep()— приостановить выполнение на заданное число микросекунд.time_sleep_until()— приостановить выполнение до достижения заданной метки времени Unix.microtime()— получить текущее время с точностью до микросекунды, что удобно для измерения задержек.
Заключение
Функция time_nanosleep() — мощный инструмент для создания задержек с очень точной синхронизацией. Понимая принципы работы функции и особенности её производительности, вы сможете воспользоваться этой возможностью для создания точных временных задержек в ваших PHP-скриптах.