Я создаю сайт, который ежедневно рассылает новости по электронной почте примерно 800 пользователям в указанное ими время. Моя проблема в том, что мой сценарий требует много времени для запуска и ожидания, поэтому я ищу несколько советов о том, как я мог бы подойти к этому лучше.
Текущий подход:
Пользователи помещаются в таблицу базы данных «очереди рассылки» с указанием их идентификатора, времени получения и флага отправки.
Затем я каждую минуту запускаю скрипт CRON, который выполняет следующие действия:
- Забрать из очереди рассылки все, что не отправлено, со временем получения меньше или равным текущему моменту.
- Просматривайте пользователей, присоединяясь к таблице предпочтений, чтобы получить выбранные ими категории (до 30 на пользователя).
- Для каждой категории найдите последние 3 статьи
- Подготовьте электронное письмо в формате HTML с этим содержимым с помощью PHPMailer
- PHPMailer использует Mailgun SMTP, чтобы избежать перегрузки моего SMTP-сервера
- Отправить письмо пользователю, отметить как отправленное в базе данных
На данный момент мои наблюдения:
- При тестировании скрипта в браузере он работает очень медленно в течение нескольких минут, а затем истекает время ожидания (без отправки электронных писем).
- При запуске через CRON каждую минуту он отправляет намного больше писем (около 1400) в течение 40 минут, я полагаю, потому что скрипт перекрывает сам себя, и флаг отправления не обновляется надежно.
Большинство пользователей настроены на получение электронной почты в одно и то же время, поэтому я провожу тестирование "наихудшего сценария" на этой основе
Вопросы
- Не слишком ли тяжел мой сценарий, запрашивая базу данных и генерируя содержимое электронной почты HTML для каждого пользователя на лету? Мне интересно, не лучше ли сгенерировать контент заранее и сохранить его для пользователя в очереди рассылки.
- Может ли администратор очередей, например Beanstalkd, помочь? Я изучал это, но изо всех сил пытаюсь понять, как внедрить в свой распорядок.
В конечном итоге мне нужно, чтобы электронные письма были надежно отправлены каждому пользователю в нужное время.
Любой совет очень ценится!