PHP CRON интенсивная отправка электронной почты - PullRequest
2 голосов
/ 15 декабря 2011

Я использую большой экземпляр Amazon EC2 - Ubuntu Natty x64 с PHP5 и MySQL.Мы выполняем PHP-скрипт через CRON - он отправляет список электронной почты (2000-4000 электронных писем), используя SMTP / PHPMailer.

Сервер работает очень медленно (некоторые из этих заданий CRON работают параллельно), и это делает ЦПперейти на 100%.Использование памяти низкое (используется только ~ 600 Мб / 8 Гб), и каждое задание CRON занимает значительную долю ЦП, например, 20-30% каждый с 4-5 параллельными работами.

Попытка точно определить проблемуЯ запустил медленный журнал запросов в MySQL, но ничто не привлекло мое внимание.Как мне сузить причину использования этого процессора?Является ли SMTP / электронная почта интенсивным процессором или это признак того, что существует проблема программирования или сервера?Спасибо!

enter image description here

РЕДАКТИРОВАТЬ: Проблема решена.Существовала тривиальная (конечно) ошибка, которая приводила к «росту» электронной почты (часть предыдущего содержимого электронной почты вставлялась в следующее письмо), поэтому предварительная обработка электронной почты становилась все более и более нелепой с каждым подписчиком.Полученные электронные письма содержали сотни / тысячи изображений отслеживания, которые все открывались одновременно на нашем сервере, то есть отображали изображения в gmail.После того, как я отразил самодовольную DDoS-атаку и два дня не спал, я собираюсь насладиться бутылкой капитана Моргана, рассматривая различные варианты, которые я сделал в жизни.

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Вещи, которые могут вызвать это (Неисчерпывающий список):

  1. Неблокированный ввод-вывод с SMTP-сервером.

  2. Реализация библиотеки SMTP, используемой в php, с манипулированием длинными строками / длинными файлами, закодированными в каждом цикле (помните: протокол должен быть отформатирован, и это проверяется / кодируется каждый раз, когда вы вызываете метод send многими другими методами ).

  3. Один (или более) запрос на одну почту.

Попробуйте измерить время, затрачиваемое на каждую операцию, выполненную внутри цикла.

Вы можете использовать простые $start = microtime (true) и printf (___FILE__.':'.__LINE__.": here after % 0.8f seconds\n", microtime(true) - $start); для файла отладки или другого инструмента профилирования.

Попробуйте сократить время форматирования / кодирования протокола.

Не разрешать больше чем Количество ядер на вашем компьютере здесь экземпляров php-скриптов, запущенных одновременно.

1 голос
/ 16 декабря 2011

Это не может быть ограничено только php ... SMTP-сервер, к которому вы подключаетесь, установлен на локальном компьютере?У тебя кончились розетки?Блокируют ли запросы сами?

Обычно для таких вещей, как то, что делают, лучше всего подходит подход на основе очереди.

Хотели ли вы использовать стороннюю службу для отправки почты, гдевы делаете это отправить HTTP-запрос API?В этом есть несколько преимуществ: большинство этих служб настроены на связь с почтовыми серверами, так что ваши письма действительно попадают в почтовые ящики, а ваш SMTP-сервер не попадает в черный список как спам.У Amazon есть сервис, который может сделать это, и другие, такие как Почтовая марка .

1 голос
/ 15 декабря 2011

Во-первых, точно определите, какие программы загружают процессор на 100%.

Если это интерпретатор PHP, значит, в вашем коде что-то не так - SMTP-клиенту никогда не удастся достичь 100% -ной загрузки, потому что многовремя SMTP-сервера будет ограничено в пропускной способности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...