Что практического использования для сна PHP ()? - PullRequest
48 голосов
/ 14 октября 2010

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

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

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

Какие-нибудь распространенные подводные камни?

Ответы [ 13 ]

47 голосов
/ 14 октября 2010

Единственное место, где он находит применение, - это создание задержки .

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

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

27 голосов
/ 15 октября 2010

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

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

23 голосов
/ 14 октября 2010

Вот фрагмент того, как я использую 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, поскольку я отправляю слишком много запросов на сервер.

9 голосов
/ 20 октября 2013

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

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

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

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

1 голос
/ 29 марта 2017

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

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

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

1 голос
/ 06 декабря 2016

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

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

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

1 голос
/ 17 августа 2013

Супер старые посты, но я подумал, что тоже буду комментировать. Недавно мне пришлось проверить ОЧЕНЬ долго работающий процесс, который создал некоторые файлы. Итак, я сделал функцию, которая перебирает функцию 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();
1 голос
/ 13 декабря 2012

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

$ready = false;
do {
  $ready = some_monitor_function();
  sleep(2);
} while (!$ready);
1 голос
/ 23 октября 2011

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

1 голос
/ 14 октября 2010

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

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

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

...