2012-01-19 1 views
2

Иногда нам нужно отправить много писем. Мы выбираем пользователей по 100, для каждого пользователя создаем почту, отправляем ее (добавляем в катушку), делаем $em->clear(). Но даже в производстве env мы не можем отправлять более 4000 электронных писем: получил «Unable allocate memory».Как отправить 12 000 писем через Swiftmailer в Symfony2?

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

+0

Ну, где ошибка, исходящая от? Например, вы используете APC, и в нем заканчивается память? – madflow

+0

Ошибка произошла на 'Swift_FileSpool :: queueMessage', когда' serialize' вызывает – Koc

ответ

2

Что мы делаем, мы его нить ... так, допустим, у вас есть таблица с вашими пользователями, и у вас есть столбец ID и EMAIL. Мы предполагаем, что будет больше/меньше равное количество окончаний ID на ноль, чем заканчивается на 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 
} 

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

+0

хорошая идея - мне это нравится! – stoefln

2

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