Добрый день. Разрабатываю программу для рассылки email через smtp Gmail. Хостинг у меня платный от reg.ru Вообщем все хорошо отсылает если адресатов 30-60, но если пробовать 500 или более, скрипт (работающий в фоновом режиме) не заканчивает свое выполнение, судя по тому что последняя инструкция - отправка письма с отчетом, не выполняется. Видимо это связано с ограничением времени выполнения php, а может и Gmail блочит чего-то там. В интернете пишут что у них лимит по скорости 20 отправлений в час. Но это бред, я отправлял и 70 и 100.
Может как то можно разбить цикл на несколько этапов (в разных файлах), чтобы обойти ограничения времени выполнения?
Но вот только как это сделать не понимаю..
KetchВообще
http://php.net/manual/ru/function.set-time-limit.phpно наверное лучше тебе что-то придумать другое.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Да set_time_limit не помогает
Вот первые две строчки моего скрипта:
<?
@set_time_limit(0);
@ignore_user_abort(1);
минуты 2-3 благодоря set_time_limit(0) он работает, далее нет.
у меня еще интервал установлен между отправкой писем в 2 секунды через sleep()
и еще, вот такой вопросик.
я пока экспериментировал с php только на хостинге.
А если, вот я допустим установлю apache и php себе на компьютер, тогда у меня никаких ограничений не будет я так понимаю?
Ketch
Если воспользуюешься готовой сборкой, то нужно будет убрать заглушку, которая исходящие складывает тебе на диск. В любом случае тебя забанят sleep тут не спасет, хотя странно что вообще гугл тебе до сих пор не забанил.
Цитата |
Разрабатываю программу для рассылки email через smtp Gmail. |
Что это значит? ТЫ цепляешься к своему аккаунту и генеришь от него письма?
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Цитата (GET @ 16.03.2015 - 11:48) |
Что это значит? ТЫ цепляешься к своему аккаунту и генеришь от него письма? |
да авторизуюсь через smtp на своей почте gmail и фигачу циклом рассылки.
мне не миллионами надо отправлять письма, а 300-400 в день. Это не так много, за такое не банят
kristall
16.03.2015 - 12:59
Клади все письма в очередь, например, в БД. Запускаешь скрипт, выбираешь из БД очередь, начинаешь рассылать. Письмо ушло, ставишь в БД флажок, что ушло или даже просто стираешь запись. Скрипт упал по таймауту, пофиг. Перезапускаешь, снова выбираешь оставшуюся очередь.
_____________
echo '<pre>',print_r($var, 1);die;
root@server# make love && war
killer8080
16.03.2015 - 13:39
Цитата (Ketch @ 16.03.2015 - 10:26) |
минуты 2-3 благодоря set_time_limit(0) он работает, далее нет. |
ни один нормальный хостер не позволит тебе надолго занимать воркер, подобные задачи ни в коем случае нельзя запускать в вебконтексте, только в консоль.
Игорь_Vasinsky
16.03.2015 - 14:08
Цитата |
Вот первые две строчки моего скрипта: <? @set_time_limit(0); @ignore_user_abort(1); |
тогда всё остальное делай так
:lol:
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
это конечно прискорбно, что вот так вот все эти ограничения понаставили, всюду запреты/вето на время, на количество.. А вот если, предположим у меня на хостинге ресурс с 100 000 зарегистрированных пользователей, каким образом делать по ним рассылку? У меня допустим на регру стоит ограничение на функцию mail() не более 50 писем одного содержания и не более 1465 адресатов в день. А если активность очень высокая у меня за 1 день 5000 новых регистраций? Мне им что выводить "Извините на сегодня лимит регистраций исчерпан, мой хостер не разрешает отправлять более 1465 уведомлений, так что отправить вам ссылку с активацией регистрации вам не могу,но вы можете получить ее почтой России если оставите свой адрес XDD)))"
Игорь_Vasinsky
16.03.2015 - 15:43
покупайте VDS.
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Цитата (Ketch @ 16.03.2015 - 11:14) |
Может как то можно разбить цикл на несколько этапов (в разных файлах), чтобы обойти ограничения времени выполнения? |
Разделить на части это означает уменьшить время выполнения скрипта, снизить количество затрачиваемой памяти, уменьшить процент нагрузки на сервер.
Отвечая предельно точно на вопрос Как обойти ограничения по времени выполнения php? ответ прост: никак!
Единственная возможность это вкладываться в установленные либо сервером, либо программистом лимитом.
_____________
Трус не играет в хокей
AllesKlar
16.03.2015 - 16:23
Ketch
Цитата |
А вот если, предположим у меня на хостинге ресурс с 100 000 зарегистрированных пользователей |
Открою тебе тайну: когда на твоем ресурсе будет хотя бы 10 000 зарегистрированных пользователей, ты уже в состоянии будешь платить зарплату хорошему программисту.
После 20 000 ты уже будешь в состоянии арендовать хорошие сервера.
После 100 000 ты задумаешься о дата-центрах.
А пока что ты просто спамер, причем фиговый.
Хочешь качественно слать спам, с хорошими показателями доставки, начни с поиска по ключевой фразе "аренда ботнет".
P.S. ты эта... не обижайся... но вот такие как ты поставят себе какой-нибудь денвер на Видвовуз-ИКС-ПЭ и напихают везде объявлений "рассылка 1 бакс за тысячу писем".
А нормальные люди потом доказывают, что они не крахоборы, и что только себестоимость качественной рассылки минимум 3 бакса за тысячу.
_____________
[продано копирайтерам]
inpost
16.03.2015 - 16:31
KetchА ты читал на php.net про массовые рассылки и функцию mail ?
Кроме этого зачем тебе за 1 раз всё делать? Воспользуйся кроном и дёргай файл 1 раз в минуту. Останется лишь идентификаторы добавить и всё
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
16.03.2015 - 16:47
Цитата (stump @ 16.03.2015 - 14:59) |
Отвечая предельно точно на вопрос Как обойти ограничения по времени выполнения php? ответ прост: никак! |
я открою тебе секрет, на PHP даже демонов пишут
тайм лимит это не ограничение, а скорее защита. По специфике веба скрипт не должен работать бесконечно, принял запрос, обработал, сгенерил контент, выплюнул, умер. И этот жизненный цикл должен быть минимальным. Для тяжелых фоновых задач нужно использовать другой SAPI. О чем я выше и писал, инструмент нужно правильно использовать.
Ketchесть возможность вызывать консольные команды (system(), exec(), etc)?
Если да то запускай скрипт в бэкграунд, лучше через nohup, в фоновом скрипте текущий прогресс выполнения задачи пиши в файл (например в JSON формате), а браузер пусть аяксом запрашивает этот файл для визуализации процесса, как вариант.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.