Что такое практическое использование для сна PHP ()?

Я только что посмотрел документы на sleep().

где бы вы использовали эту функцию?

это там, чтобы дать CPU перерыв в дорогостоящей функции?

какие подводные камни?

13 ответов


одно место, где он находит применение для создания задержка.

допустим, вы создали искатель, который использует curl/file_get_contents для получения удаленных страниц. Теперь вы не хотите бомбардировать удаленный сервер слишком большим количеством запросов за короткое время. Таким образом, вы вводите задержку между последовательными запросами.

sleep принимает аргумент в секундах, его друг usleep принимает аргументы в микросекундах и в некоторых случаях более подходит.


другой пример: вы запускаете какой-то пакетный процесс, который интенсивно использует ресурс. Возможно, вы идете по базе данных 9,000,000 названий книг и обновляете около 10% из них. Этот процесс должен выполняться в середине дня, но необходимо сделать так много обновлений, что запуск пакетной программы приведет к обходу сервера базы данных для других пользователей.

таким образом, вы изменяете пакетный процесс для отправки, скажем, 1000 обновлений, затем sleep в течение 5 секунд, чтобы дать сервер баз данных возможность завершить обработку любых запросов от других пользователей, которые создали резервную копию.


вот фрагмент того, как я использую sleep в одном из моих проектов:

foreach($addresses as $address)
{
  $url = "http://maps.google.com/maps/geo?q={$address}&output=json...etc...";
  $result = file_get_contents($url);
  $geo = json_decode($result, TRUE);

  // Do stuff with $geo

  sleep(1);
}

В этом случае sleep помогает мне предотвратить блокировку Google maps, потому что я отправляю слишком много запросов на сервер.

Edit: это пример того, что говорит codaddict.


старый вопрос я знаю, но другая причина использования u/sleep может быть, когда вы пишете код безопасности/криптографии, такой как сценарий аутентификации. Несколько примеров:

  1. вы можете уменьшить эффективность потенциальной атаки грубой силы, сделав свой сценарий входа целенаправленно медленным, особенно после нескольких неудачных попыток.
  2. также вы можете добавить искусственную задержку во время шифрования, чтобы смягчитьсроки атаки. Я знаю, что шансы на то, что вы будете писать такой глубокий код шифрования на таком языке, как PHP, невелики, но я считаю, что все еще действительны.

редактировать

использование u / sleep против временных атак не является хорошим решением. Вы все еще можете получить важные данные в атаке синхронизации, вам просто нужно больше образцов, чтобы отфильтровать шум, который добавляет u/sleep.

вы можете найти более подробную информацию о этой теме: может случайный сон предотвращает временные атаки?


вы можете использовать sleep для приостановки выполнения сценария... например, чтобы задержать AJAX вызов на стороне сервера или реализация наблюдателя. Вы также можете использовать его для имитации задержки.

Я использую это также для задержки sendmail () & co. .

кто-то использует use sleep() для предотвращения DoS и входа в систему brutefoces, я не согласен, потому что в этом вам нужно добавить некоторые проверки, чтобы предотвратить запуск пользователя несколько раз.

проверить также usleep.


мне пришлось использовать его недавно, когда я использовал API геолокации Google. Каждый адрес в цикле необходим для вызова сервера Google, поэтому ему нужно немного времени, чтобы получить ответ. Я использовал usleep(500000) чтобы дать всему, что связано достаточно времени.


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

$ready = false;
do {
  $ready = some_monitor_function();
  sleep(2);
} while (!$ready);

супер старые сообщения, но я думал, что я также прокомментирую. Недавно мне пришлось проверить очень длительный процесс, который создал некоторые файлы. Поэтому я сделал функцию, которая повторяет функцию cURL. Если файл, который я ищу, не существует, я сплю файл php и снова проверяю немного:

function remoteFileExists() {
    $curl = curl_init('domain.com/file.ext');

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 404) {
              sleep(7);
              remoteFileExists();
        }
        else{
            echo 'exists'; 
        }
    }

    curl_close($curl);

}

echo remoteFileExists();

одним из его приложений является, если я отправляю письма по сценарию 100+ клиентам, то эта операция займет максимум 1-2 секунды, поэтому большинство веб-сайтов, таких как hotmail и yahoo, считают его спамом, поэтому, чтобы избежать этого, нам нужно использовать некоторую задержку в выполнении после каждой почты.


среди прочего: вы тестируете веб-приложение, которое делает запросы ayncronous (вызовы AJAX, ленивая загрузка изображений,...)

вы тестируете его локально, поэтому ответы немедленно, так как есть только один пользователь (вы) и нет задержки сети.

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


быстрый пример псевдо-кода, где вы не хотите получать миллионы предупреждающих писем для одного события, но хотите, чтобы ваш скрипт продолжал работать.

  if CheckSystemCPU() > 95  
        SendMeAnEmail()
        sleep(1800)
  fi

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

sleep(30);
include 'cronjob.php';

Я называю этот файл и cronjob.РНР каждую минуту.


Это немного странный случай...регулирование передачи файлов.

в службе передачи файлов, которую мы запустили давным-давно, файлы обслуживались с серверов восходящей линии связи 10Mbps. Чтобы сеть не увязла, сценарий загрузки отслеживал количество пользователей, загружаемых одновременно, а затем вычислял, сколько байтов он может отправлять в секунду на пользователя. Он отправит часть этой суммы, затем поспит немного (1/4 секунды, я думаю), а затем отправит больше...так далее.

таким образом, серверы работали непрерывно со скоростью около 9,5 Мбит / с без проблем с насыщенностью восходящей линии связи...и всегда динамически регулируя скорость загрузки.

Я бы не сделал этого так, или в PHP, сейчас...но в то время это работало отлично.