Я просто просмотрел документы на sleep()
.
Где бы вы использовали эту функцию?
Возможно ли, чтобы процессор перестал дорожать?
Любые распространенные ошибки?
Я просто просмотрел документы на sleep()
.
Где бы вы использовали эту функцию?
Возможно ли, чтобы процессор перестал дорожать?
Любые распространенные ошибки?
Одно место, где оно находит применение, - это создать задержку.
Допустим, вы создали искателя, который использует 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, потому что я посылаю слишком много запросов на сервер.
Изменить: это пример того, что говорит codaddict.
Старый вопрос, который я знаю, но другая причина для использования u/sleep может быть, когда вы пишете код безопасности/криптографии, например аутентификацию script. Несколько примеров:
Вы можете использовать sleep для приостановки выполнения script... например, для задержки вызова AJAX со стороны сервера или реализации наблюдателя. Вы также можете использовать его для имитации задержек.
Я использую это также для задержки sendmail() и co..
Кто-то использует функцию sleep() для предотвращения DoS и login brutefoces, я не согласен, потому что в этом вам нужно добавить некоторые проверки, чтобы предотвратить запуск пользователем несколько раз.
Также проверьте usleep.
Мне пришлось использовать его недавно, когда я использовал Google Geolocation API. Каждому адресу в цикле необходимо было позвонить на сервер 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();
Одно из его приложений: если я отправляю письма от script до 100+ клиентов, тогда эта операция займет максимум 1-2 секунды, поэтому большинство веб-сайтов, таких как hotmail и yahoo, считают это спамом, поэтому, чтобы избежать это нам нужно использовать некоторую задержку в выполнении после каждой почты.
Среди других: вы тестируете веб-приложение, которое делает асинхронные запросы (вызовы AJAX, ленивая загрузка изображений...)
Вы тестируете его локально, поэтому ответы выполняются немедленно, так как есть только один пользователь (вы) и нет задержки в сети.
Использование sleep
позволяет вам видеть/тестировать поведение веб-приложения при загрузке и сбое сети при запросах.
Пример быстрого псевдокода, где вы можете не захотеть получать миллионы предупреждающих сообщений для одного события, но вы хотите, чтобы ваш script продолжал работать.
if CheckSystemCPU() > 95
SendMeAnEmail()
sleep(1800)
fi
Это немного странный случай... дросселирование файла.
В службе передачи файлов, которую мы запускали много лет назад, файлы были отправлены с серверов восходящей линии 10 Мбит/с. Чтобы предотвратить увязку сети, загрузка script отслеживала, сколько пользователей загружалось за один раз, а затем подсчитывало, сколько байтов она может отправлять за секунду на пользователя. Он отправил бы часть этой суммы, а затем спящий момент (1/4 секунды, я думаю), затем отправьте больше... и т.д.
Таким образом, серверы работали непрерывно примерно на 9,5 Мбит/с без проблем с насыщением восходящей линии... и всегда динамически изменяли скорость загрузки.
Я бы не сделал этого так или в PHP, теперь... но он отлично работал в то время.
Другой способ использования: если вы хотите выполнять cronjob чаще всего каждую минуту. Для этого я использую следующий код:
sleep(30);
include 'cronjob.php';
Я вызываю этот файл и cronjob.php каждую минуту.