Функция сна использует ресурсы сервера?
У меня есть две причины использовать функцию сна: во-первых, чтобы автоматически отправить электронное письмо с подтверждением клиенту через 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>');
}