sleep()
В этой статье мы рассмотрим функцию PHP sleep(): её синтаксис, возвращаемые значения и примеры использования.
Функция PHP sleep() приостанавливает выполнение скрипта на фиксированное количество целых секунд. В этой статье рассматривается её синтаксис и возвращаемые значения, случаи, когда задержка скрипта действительно полезна, особенности блокировки и обработки сигналов, а также отличия sleep() от функций с субсекундной точностью.
Синтаксис
sleep(int $seconds): int|false$seconds— количество целых секунд, на которое нужно приостановить скрипт. Должно быть неотрицательным целым числом; передача отрицательного значения вызовет ошибку.- Возвращаемое значение —
sleep()возвращает0при успешном выполнении. Если вызов прерван сигналом (например, сигналом будильника или обработчикомCtrl+Cв CLI), функция возвращает количество оставшихся секунд сна — ненулевое положительное целое число. Значениеfalseвозвращается только при полном сбое вызова.
Поскольку sleep() принимает только целые числа, минимальная задержка составляет одну секунду. Для более тонкого управления используйте usleep() (микросекунды) или time_nanosleep() (наносекунды).
Базовое использование
Вызовите sleep() и передайте количество секунд ожидания. Весь код после вызова выполняется только после истечения задержки:
Скрипт выводит первое сообщение, блокируется на пять секунд, затем выводит второе. Паузу можно наглядно увидеть, замерив время выполнения скрипта:
<?php
$start = microtime(true);
sleep(2);
$elapsed = microtime(true) - $start;
echo "Waited about " . round($elapsed, 1) . " seconds\n";
?>Вывод: Waited about 2 seconds, что подтверждает паузу. (Подробнее об измерении прошедшего времени см. microtime().)
Когда используется sleep()?
sleep() наиболее полезна в скриптах командной строки и фоновых процессах, где короткая пауза является намеренной:
- Опрос с задержкой — проверка очереди, файла или API через регулярный интервал вместо непрерывного цикла, интенсивно потребляющего CPU.
- Ограничение частоты запросов — соблюдение интервалов между запросами, чтобы не превышать лимиты сторонних API.
- Повтор с экспоненциальной задержкой — ожидание перед повторной попыткой после сбоя, часто с увеличивающимся интервалом.
Вот простой пример повтора с нарастающей задержкой:
<?php
$maxRetries = 3;
for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
$ok = ($attempt === 3); // pretend it succeeds on the 3rd try
if ($ok) {
echo "Succeeded on attempt $attempt\n";
break;
}
echo "Attempt $attempt failed, retrying...\n";
sleep($attempt); // back off longer each time: 1s, then 2s
}
?>Скрипт выводит два сообщения «failed» (ожидая 1с, затем 2с) и в итоге Succeeded on attempt 3.
sleep() блокирует весь процесс
sleep() — это блокирующий вызов: пока он ждёт, в данном PHP-процессе ничего другого не происходит. Это важно в двух аспектах:
- Никогда не вызывайте
sleep()в обычном веб-запросе. Спящий запрос удерживает воркер PHP-FPM (и зачастую браузерное соединение) в бездействии, что снижает пропускную способность и может вызвать превышение тайм-аута запроса. Паузы предназначены для CLI-скриптов, cron-заданий и воркеров очередей. - Функция не передаёт управление другому коду. Если нужно ждать без блокировки, это задача для событийного цикла или асинхронного рантайма, а не
sleep().
Обработка прерванного сна
В CLI сигнал может прервать сон досрочно. В этом случае sleep() возвращает оставшееся количество секунд вместо 0, что позволяет при необходимости продолжить ожидание:
<?php
$remaining = sleep(5);
if ($remaining > 0) {
echo "Interrupted with $remaining seconds left\n";
} else {
echo "Slept the full duration\n";
}
?>При нормальном завершении сна $remaining равно 0 и скрипт выводит Slept the full duration.
Субсекундные задержки: usleep() и другие функции
Поскольку sleep() принимает только целые секунды, PHP предоставляет более точные альтернативы:
| Функция | Единица | Когда использовать |
|---|---|---|
sleep() | секунды | достаточно паузы в целые секунды |
usleep() | микросекунды (1/1 000 000 с) | нужна субсекундная точность |
time_nanosleep() | секунды + наносекунды | нужен очень точный контроль |
time_sleep_until() | целевая метка времени | нужно проснуться в конкретный момент |
Например, чтобы ограничить цикл примерно 10 итерациями в секунду, добавьте паузу в 100 000 микросекунд (десятая доля секунды) на каждой итерации:
<?php
$interval = 1000000 / 10; // microseconds per iteration -> 100000
for ($i = 1; $i <= 3; $i++) {
echo "Tick $i\n";
usleep((int) $interval);
}
?>Вывод: Tick 1, Tick 2, Tick 3 с интервалом примерно в десятую долю секунды между строками.
Заключение
sleep() — надёжный способ приостановить PHP-скрипт на целое число секунд. Помните, что функция блокирует весь процесс, поэтому не используйте её в живых веб-запросах — применяйте в CLI-инструментах, cron-заданиях и воркерах, как правило, для опроса, ограничения частоты запросов и повтора с задержкой. Когда нужна более тонкая настройка времени, обратитесь к usleep(), time_nanosleep() или time_sleep_until(). Подробнее о работе со временем в PHP см. PHP Дата и время.