W3docs

sleep()

В этой статье мы рассмотрим функцию PHP sleep(): её синтаксис, возвращаемые значения и примеры использования.

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

Синтаксис

sleep(int $seconds): int|false
  • $seconds — количество целых секунд, на которое нужно приостановить скрипт. Должно быть неотрицательным целым числом; передача отрицательного значения вызовет ошибку.
  • Возвращаемое значениеsleep() возвращает 0 при успешном выполнении. Если вызов прерван сигналом (например, сигналом будильника или обработчиком Ctrl+C в CLI), функция возвращает количество оставшихся секунд сна — ненулевое положительное целое число. Значение false возвращается только при полном сбое вызова.

Поскольку sleep() принимает только целые числа, минимальная задержка составляет одну секунду. Для более тонкого управления используйте usleep() (микросекунды) или time_nanosleep() (наносекунды).

Базовое использование

Вызовите sleep() и передайте количество секунд ожидания. Весь код после вызова выполняется только после истечения задержки:

php— editable, runs on the server

Скрипт выводит первое сообщение, блокируется на пять секунд, затем выводит второе. Паузу можно наглядно увидеть, замерив время выполнения скрипта:

<?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 Дата и время.

Практика

Практика
Какова функция sleep() в PHP?
Какова функция sleep() в PHP?
Was this page helpful?