- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
У меня на одном из сайтов происходит рассылка новостей мемберам. Мемберов не много не мало 50k. Рассылку делаю через php-функцию mail() по 500 писем за один раз (через BCC). Так вот, скрипт рассылки в момент рассылки грузит наш выделенный сервер (P4 2GHz, 1024 RAM) до отказа. Обычно приходится делать reboot.
Нормально ли это? Может вся проблема в mail() и нужно переходить на отправку через SMTP? Или это у меня косяки в скрипте рассылки. Я не профессиональный программист, а только любитель. Взять в штат программиста пока не по-карману :( Заранее спасибо за ответы.
нде
ну если Вы отправляете индивидуальные письма
тоесть mail user1, mail user2, mail user3, то действительно сервак тупить начнет, кроме того пхп по определению тупит сильно, но чтобы не переписывать
вариант 1 если пхп стоит как модуль апача - пересоберите как cgi
вариант 2 отправляйте по скажем 300 писем раз в минуту по крону
вариант 3 щас гляну как в функции mail реализовано отправка невидимых копий.
Чтобы распределить нагрузку во времени, лучше сделать очередь и обрабатывать её по cron.
Ergo, функция mail() все равно использует программу sendmail, которая обращается к SMTP серверу. В ряд ли переход на самостоятельное подключение к SMTP ускорит работу скрипта.
Я бы рассмотрел такое решение: запускать скрипт кроном посреди ночи раз 50, чтобы при каждом запуске он рассылал письма только по части адресов из бызы.
вариант 1 если пхп стоит как модуль апача - пересоберите как cgi
При чем здесь это? Если скрипт запускается вместе из-под апача, то модель даже лучше. Если из командной строки, то апач вообще не имеет к PHP никакого отношения.
ну если Вы отправляете индивидуальные письма
тоесть mail user1, mail user2, mail user3, то действительно сервак тупить начнет
В том то и дело, что у всех писем одинаковый текст. Просто я рассылаю его 100 раз по 500 штук через BCC. Может стоит просто это делать 10 раз по 5000 штук?
кроме того пхп по определению тупит сильно, но чтобы не переписывать
вариант 1 если пхп стоит как модуль апача - пересоберите как cgi
Если начать использовать CGI, то тупить к сожалению начну уже я :(
CGI мне не нравится сложностью использования.
Чтобы распределить нагрузку во времени, лучше сделать очередь и обрабатывать её по cron.
Это то, что мне первое пришло в голову. Хочется более простого решения. Может переход на отправку через SMTP будет оптимальнее? Просто неужели 50000 одинаковых писем это большая нагрузка на сервак?
Я бы рассмотрел такое решение: запускать скрипт кроном посреди ночи раз 50, чтобы при каждом запуске он рассылал письма только по части адресов из бызы.
ок. спасибо за ответы. меня как раз интересовало mail() vs SMTP. Если разницы нет, то буду думать на счет CRON-а.
Процесс реализации этого на CRON-е оказался довольно легким :)
Еще один вопрос, как лучше делать рассылку через BCC? Какой максимум получателей лучше ставить в BCC? На сколько я знаю если заголовок слишком большой он обрезается.
И второй вопрос. Реально ли отправлять по CRON-у 50000 индивидуальных писем? Т.е. сначала все 50000 писем ложим в таблицу, а потом раз в минуту запускается скрипт и отправляет 50 писем. В день тогда можно отправить около 72000 писем. Т.е. не сильная ли нагрузка на сервер будет 50 писем в минуту?
Я не совсем в PHP теме, поэтому не знаю чего вдруг ваш sendmail грузит сервер. Но поскольку сталкивался с задачей - напишу свои 5 копеек, может что пригодится.
Вообще все вопросы связанные с нагрузкой нужно начинать решать от понимания того как все работает. Что происходит когда вы отсылаете письмо с CC (или BCC) со своей машины наружу? Вы формируете письмо в 1 экземпляре (1 body) с длинной предлинной строкой адреса, где у вас просто перечислены все адреса получателей. Затем Вы его передаете в механизм отсылки. Понятно, что чем меньше писем, тем меньше объем передаваемых данных, а следовательно немного экономичнее будет расход памяти и приложение будет работать побыстрее. То есть 10 писем по 5000 реципиентов теоретически лучше, чем 100 по 500.
Далее начинается самое интересное. Если ваш механизм отсылки отсылает почту НАПРЯМУЮ по 25 порту к получателю, то он:
- рубит длинную строку BCC на отдельные адреса
- вычленяет из каждого адреса получателя имя домена
- резолвит имя домена в IP адрес (? может и не делать этого)
- лезет в ДНС для получения MX записи - адреса почтовика, который отвечает за обработку почты на данном доменном имени
- открывает соединение по 25 порту к полученному IP сервера
- шлет данные
- закрывает соединение
- повторяет это все в цикле покуда BCC не кончится
Если с соединением некузяво, то еще при каждом соединении что-то происходит. В зависимости от настроек это может быть посылка системных сообщений, постановка сообщения в очередь или просто программный отлуп с возвратом кода ошибки.
Понятно, что в данном случае механизм, который отсылает почту (sendmail к примеру), берет ваш текст одного письма с 5000 BCC, разбирает его и ДУПЛИЦИРУЕТ в 5000 писем, чтобы затем соединиться С КАЖДЫМ сервером и отослать КАЖДОЕ письмо.
Собственно, я к чему привел такой перечень подробный - учтите, что у Вас на отправку одного письма будет уходить от долей секунды до десятков секунд время. Это к вопросу об отправке 50 писем в минуту. Одно письмо на несуществующий адрес - и все, пока отрезолвится, пока коннект поймет что IP нерабочий, пока то да се... Это все нужно учитывать.
Второй вариант - если вы отправляете почту через relay, то есть некий промежуточный сервер. Например, стоящий локально или на другой машине MDaemon или вообще через внешний сервер вашего провайдера. В таком случае вы формируете свои 10 писем по 5000 получателей, и передаете их серверу на обработку. Далее весь описанный процесс будет проблемой почтового сервера, который обычно немного умнее sendmail и может
а) сэкономить на дубликатах если домены для нескольких получателей находятся на одном физически IP (данная возможность должна быть реализована в почтовике (!)
б) распределять нагрузку на канал и процессов при отправке большого числа писем в соответствии со своими настройками, вести очередь и вообще очень корректно обрабатывать непростые ситуации
К вопросу о максимальной длине BCC - надо бы посмотреть RFC на эту тему, но мне кажется принципиального ограничения быть не должно, т.к. при первом способе все равно все письма сплитятся в одиночные на уровне отправителя, а при втором - все зависит от того как реализован почтовик. Теоретически ему все равно должно быть какой длины строки разбор делать.
Поэтому вообще самое оптимальное на мой взгляд решение, которое просто и примитивно реализуется - это поставить почтовый сервер типа MDaemon, а приложение будет просто писать письма в файлы в определенную папку типа Outbox, а MDaemon дальше уже сам разберется по сколько штук и с какой периодичностью что отправлять.
В противном случае ваш рассыльщик будет недостаточно жизнеспособен по ряду причин: обработка кривых ответов почтовиков, лишняя нагрузка, сложности в разработке параллельного обработчика. Плюс практически нулевая устойчивость к спам-фильтрам, которые порежут все ваши сообщения на раз, даже если они не спам а нормальная информационная рассылка с тучей подписчиков.