Я готовлю веб-сайт, который отправит уведомления по электронной почте зарегистрированным пользователям. На основе моего опыта я знаю, та отправка, электронные письма являются несколько болезненным процессом для PHP, особенно когда мы говорим приблизительно тысячи. Один из моих веб-сайтов посылает электронное письмо время от времени 1000-1500 людям. Требуется приблизительно 5 минут для PHP для выполнения этого, таким образом, мы выполняем его в течение ночи, когда загрузка сервера является самой низкой. Я использую собственный компонент mail()
функция без любого SMTP. Это хорошо работает на выделенном сервере, но я не большой поклонник этого решения.
Я хочу смочь отправить подобные суммы в любое время, не рискуя потерей работоспособности сервера (и это, чтобы быть помещенным в черный список).
Я читал, то идеальное решение состоит в том, чтобы послать электронные письма в пакетах (скажите относительно 20), каждые несколько минут из сценария это инициировано Кроном. Это кажется мне как действительно разумная идея, но... Что, если у меня нет доступа к Крону (не все поставщики услуг хостинга предоставляют доступ к нему) и веб-сайт не достаточно популярно, чтобы смочь инициировать сценарий на загрузке страницы?
Я настаиваю на том, чтобы использовать свой сервер, чтобы сделать отправку по почте и не любое внешнее решение.
PS. Я нашел решения как они: http://www.mywebcron.com/, но хорошо работает это?
Править
Только добавить:
Используя почтовый класс PHP, такой как PHPmailer или SwiftMailer, вы можете отправлять почту напрямую через SMTP, что будет намного быстрее. И да, отправлять большое количество писем лучше всего через cron, поэтому вы отправляете X писем каждую минуту. Таким образом вы избежите перегрузки сервера. Если вы не можете создать рабочие места в cron на вашем сервере, я предлагаю вам сменить хостинг-провайдера, иначе сайт, на который вы перешли по ссылке, будет вашей единственной жизнеспособной альтернативой (но вы зависите от какой-то третьей стороны таким образом, что на самом деле не очень круто)
.Если вы не можете использовать периодическую работу, вы можете захотеть посмотреть решение о очереди, как Gearman.
То, что вы хотели бы сделать, это толкать все ваши электронные письма в очередь и иметь 1 или более длинные рабочие, которые выбирают работу с очереди. Если вы хотите добавить задержку в систему, просто добавьте там сна.
Некоторые действительно основные псевдокод:
#wherever you launch the jobs from
for each user
gearman.push(user.generateEmail())
#in your consumer script
while true
message = gearman.consume()
message.send()
sleep(5)