Как отправить 12 000 писем через Swiftmailer в Symfony2? - PullRequest
2 голосов
/ 19 января 2012

Иногда нам нужно отправить много писем. Мы отбираем пользователей по 100, для каждого пользователя создаем почту, отправляем ее (добавляем в спул), делаем $em->clear(). Но даже в рабочей среде мы не можем отправить более 4000 электронных писем: получено «Невозможно выделить память».

Какой правильный способ сделать это? Добавьте аргумент в нашу команду и выполните его много раз, используя --skip=4000?

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Я упоминаю свой опыт: я отправляю около 8000 личных писем с symfony и SwiftMailer на общий сервер с очень ограниченными ресурсами.У меня была таблица с пользователями и я создал задачу или команду, в которой нужно сделать запрос с разбивкой на страницы, и передать размер страницы через параметр в моей задаче.Y выполнял эту задачу или команду на задании cron каждые 30 минут.Вы можете настроить в зависимости от ваших ресурсов.С размером страницы запроса вы управляете тем, сколько писем будет отправлено, а с помощью cron job вы можете управлять временем между партиями.Я признаю, что есть более профессиональные и надежные решения, но это был единственный способ, который я нашел на общем сервере с ограниченными ресурсами.

2 голосов
/ 19 января 2012

Что мы делаем, мы это продвигаем ... так, скажем, у вас есть таблица с вашими пользователями и столбец ID и EMAIL. Мы предполагаем, что число идентификаторов, оканчивающихся на ноль, будет больше или меньше, чем на 1, 2 и т. Д.

Теперь у нас есть наш сценарий, который отправляет электронные письма только для отправки писем людям, заканчивающимся, скажем, на ноль, и другой сценарий, который отправляет людям, чьи поля id заканчиваются на 1 и т. Д. Например, вы используете параметры, чтобы определить это, скажем, ваш скрипт называется send-a-lot.php, вы запустите 10 команд:

php send-a-lot.php --ending-on=0
php send-a-lot.php --ending-on=1
php send-a-lot.php --ending-on=2
php send-a-lot.php --ending-on=3
php send-a-lot.php --ending-on=4
php send-a-lot.php --ending-on=5
php send-a-lot.php --ending-on=6
php send-a-lot.php --ending-on=7
php send-a-lot.php --ending-on=8
php send-a-lot.php --ending-on=9

Внутри вашего кода вы хотите сделать что-то вроде:

if ($id % 10 == $endingOnParameter) {
  // send the mail
}

Это не совсем то, что вы спрашивали, но, по крайней мере, именно это мы и сделали, чтобы помочь "некоторым" в нашей проблеме с нагрузкой

...