Функция сна использует ресурсы сервера?

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

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

Мой вопрос в том, что он использует серверные ресурсы? Будет ли это замедлять работу? Есть ли другие проблемы с использованием функции сна? Спасибо заранее!

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

В то время как задание cron идеально подходит для повторяющихся вещей, если вы хотите только один раз запустить команду в определенное время в будущем, 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, который обрабатывает все переданные параметры и делает все, что вы хотите сделать.

Ответ 4

sleep();

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

Да, это замедляет работу по времени, установленному во сне (...).

Есть и другие проблемы при использовании "sleep".

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

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

Ответ 5

Вместо сервера 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>');

}