2010-03-04 2 views
12

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

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

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

ответ

13

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

+0

Итак, если мой хостинг-сервис является авторитетным (например, godaddy), мне, вероятно, не придется беспокоиться о проблемах с ОЗУ? Спасибо за вашу помощь! – Dustin

+9

Не рекомендуется использовать функцию сна в скрипте PHP serveride. Вы теряете поток веб-сервера, пока вы спите. Кроме того, если вы слишком долго будете спать, любой сервер будет убивать ваш процесс застрял, или пользовательский браузер отключится и сдастся. Правильный способ сделать это, либо с помощью cronjob, либо с автономным процессом. – Vlad

+4

Вы бы открыли себя широко открытыми для тривиальной атаки DoS. Некоторый рывок мог зарегистрировать пару сотен счетов в течение минуты, а спальные потоки апачей съедят всю вашу память. –

8

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

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

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

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

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

-1
sleep(); 

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

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

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

кто-то в this page говорит

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

-1

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

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

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

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

Смежные вопросы