У меня есть две причины использовать функцию сна: во-первых, чтобы автоматически отправить электронное письмо с подтверждением клиенту через 20 минут после того, как они свяжутся с нами. Я не хочу использовать задания cron, потому что я хочу, чтобы это было ровно 20 минут (и я устал от того, что мой веб-сервер отправил мне электронные письма, рассказывающие мне, что они инициировали работу cron ….. новое письмо каждые 20 минут! )
Вторая причина: я слышал о людях, отправляющих массовые электронные письма, используя функцию сна. Поскольку мой сервер будет разрешать только 100 электронных писем в час, я хочу использовать функцию сна, чтобы сценарий был спящим в течение часа, а затем продолжить, где он был поднят.
Мой вопрос заключается в следующем: использует ли он серверные ресурсы? Будет ли это замедлять работу? Есть ли другие проблемы с использованием функции сна? Заранее спасибо!
Пока процесс sleep
он не будет потреблять процессорное время, но для рабочего процесса все еще требуется физическая память и / или файл подкачки для поддержки этого процесса. Другими словами, процесс интерпретатора PHP должен продолжать работать. Пока у вашего сервера достаточно ОЗУ, это не должно быть проблемой.
Время доставки электронной почты довольно изменчиво, поэтому вы не получите электронное письмо в почтовый ящик кому-то через 20 минут, независимо от того, что вы делаете.
Я использую длинный фоновый скрипт – запускаемый из CLI, а не apache – для обработки электронной почты. Мое приложение отправляет электронные письма в таблицу очередей, которая проверяется почтовым скриптом каждые 15 секунд. Это сон () между опросами. Таким образом, у меня есть только один скрипт, пытающийся подключиться к SMTP-серверу и спать.
Эта часть приложения успешно работает без каких-либо серьезных проблем в течение последних 2 лет. Единственное раздражение заключается в том, что скрипт работает – если он по какой-либо причине опускается, почта не выходит, пока вы не вернете ее. Но в худшем случае вы можете просто перезапустить его через cron периодически, например, ежедневно.
Если бы я решал вашу проблему, я бы просто поместил столбец «Время отправки» в таблицу очередей и давал ей 20 минут для этих писем. Тогда почтовая программа SELECT * FROM mail_queue WHERE send_time <= NOW()
В качестве альтернативы вы можете использовать реальную работу, например beanstalkd. Я выбрал таблицу очередей исключительно для того, чтобы поддерживать простой стек приложений.
Знайте, что это очень старая нить, но некоторые люди могут столкнуться, так что вот еще одно предложение.
Это будет работать только в том случае, если:
Вместо того, чтобы долго спать, и я думаю, что это плохая практика (для этого сценария), вы можете рассмотреть команду at для этого.
В то время как работа cron идеально подходит для повторяющихся вещей, если вы только хотите запускать команду один раз в определенное время в будущем, это ваш лучший друг.
Вот как я планирую отправлять электронные письма через 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, который обрабатывает все переданные параметры и делает все, что вы хотите сделать.
sleep();
Да, сон использует серверные ресурсы.
Да, это замедляет то, что вы спали (…).
Есть и другие проблемы при использовании «сна».
кто-то на этой странице говорит
Помните, что sleep () означает «Пусть PHP время, чтобы сделать что-то другое». Это означает, что sleep () может быть прерван сигналами. Это важно, если вы работаете с pcntl_signal () и друзьями.
Вместо сервера SLEEP, т.е. sleep(3);
Я использовал «клиентский» сон с помощью Javascript:
if (empty($_COOKIE['my_Timer'])) {die('<script>window.setTimeout(\'window.location="'.$_SERVER['REQUEST_URI'].'"; \',3000);</script>');} setcookie('my_Timer', "blabla", time()+999999, '/');