Функция сна использует ресурсы сервера? - PullRequest
12 голосов
/ 04 марта 2010

У меня есть две причины использовать функцию сна: во-первых, автоматически отправлять подтверждение по электронной почте клиенту через 20 минут после того, как он связался с нами. Я не хочу использовать задания cron, потому что хочу, чтобы это заняло ровно 20 минут (и мне надоело, что мой веб-сервер посылает мне электронные письма, в которых говорится, что они инициировали задание cron ..... новое электронное письмо каждые 20 минут! )

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

Мой вопрос таков: использует ли он ресурсы сервера? Это замедлит вещи? Есть ли другие проблемы с использованием функции сна? Заранее спасибо!

Ответы [ 5 ]

13 голосов
/ 04 марта 2010

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

8 голосов
/ 04 марта 2010

Время доставки электронной почты варьируется, поэтому вы не получите письмо в чей-то почтовый ящик ровно через 20 минут, независимо от того, что вы делаете.

Я использую длительный фоновый скрипт - запускаемый из CLI вместо apache - для обработки отправки электронной почты. Мое приложение сбрасывает электронные письма в таблицу очередей, которую почтовый скрипт опрашивает каждые 15 секунд. Это sleep () между опросами. Таким образом, у меня есть только один скрипт, пытающийся подключиться к SMTP-серверу и спящий.

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

Если бы я занялся вашей проблемой, я просто поместил бы столбец «Время отправки» в таблицу очередей и назначил бы ему 20 минут для этих писем. Почтовик тогда SELECT * FROM mail_queue WHERE send_time <= NOW()

В качестве альтернативы, вы можете использовать настоящую очередь заданий, например, beanstalkd. Я выбрал таблицу очередей исключительно для простоты стека приложений.

1 голос
/ 04 мая 2017

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

Это будет работать только если:

  • Вы находитесь на сервере Linux
  • Вы можете запускать команды (например, exec, некоторые общие хостинги не позволяют этого)

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

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

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

Пример:

$wait_time=time()+mt_rand(3600,36000);
//wait a random amount of time between 1 and 10 hours
//$wait_time=time()+1200   -if you want 20 minutes exactly.
$cmd_string=escapeshellcmd('php /path/to/script.php '.$par1.' '.$par2.' "'.$par3.'" '.$parX);
exec("echo -e '$cmd_string'   | at ".date("Hi M d",$wait_time));

Чем вы создаете script.php, который обрабатывает все переданные параметры и делает все, что вы хотите.

0 голосов
/ 09 июня 2015

вместо сервера SLEEP, т.е. sleep(3);

Я использовал сон на стороне клиента, используя Javascript:

if (empty($_COOKIE['my_Timer'])) {

   setcookie('my_Timer', "blabla",  time()+999999, '/');

die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');

}
0 голосов
/ 09 мая 2012
sleep();

Да, режим сна использует ресурсы сервера.

Да, это замедляет время, когда вы засыпаете (...).

При использовании «сна» возникают другие проблемы.

кто-то на этой странице говорит

Помните, что sleep () означает «Дайте PHP время заняться другими делами». Это означает, что sleep () может прерываться сигналами. Это важно, если вы работаете с pcntl_signal () и друзьями.

...