Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> зависает страница при массовой рассылке mail 
:(
    Опции темы
begin
Дата 17.3.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Я использую функцию mail для рассылки новостей всем зарегиным пользователям на своем сайте. Для этого скрипт рассылки просто перебирает всех пользователей из базы, и отсылает в цикле текст письма. 

И все работало до поры до времени. Но теперь, когда на сайте стало почти 1000 пользователей, страница управления рассылкой просто зависает в браузере - ответ от скрипта идет слишком долго, и браузер думает, что страница не найдена. И кажется, плюс ко всему, теперь еще и последние по списку юзеры не получают письмо. Видимо скрипт к тому времени убивается на сервере :(

Подскажите, как мне решить эту проблему? Я думаю, нужно разбить процесс на части, скажем по 100 пользователей.. Но как это реализовать? Как заставить думать браузер (да и сам сервер), что скрипт не завис?

Добавлено через 4 минуты и 42 секунды
Вот нашел сходный топик, но там так и не решили этот вопрос:

http://forum.vingrad.ru/topic-123094.html

Это сообщение отредактировал(а) begin - 17.3.2008, 15:19
PM MAIL   Вверх
bars80080
Дата 17.3.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



можно увеличить время работы скрипта set_time_limit();

либо в самом деле разбить рассылку. как? больше зависит от вас

с ходу такое решение:
рассылке присваиваем идентификационный номер (№5) можно вводить из формы, перекидываем список подписчиков в спец. таблицу данных (назовём её очередь), вместе с их адресами и этим id, 
начинаем рассылать по адресам из этой таблицы, отослал - изменил флаг в таблице на 1, а по исходу сотни в браузер сообщение "первая сотня ушла", по окончанию сообщение - рассылка полностью завершена
в случае если это сообщение в итоге не появилось, оператор снова жмёт кнопку (в принципе можно даже на js повесить), скрипт запускается снова, вытаскивает из таблицы все записи с флагом не 1 и рассылает

что-то такое
по окончанию - удаление всех записей
PM MAIL WWW   Вверх
KonstRuctor
Дата 17.3.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 31.3.2006
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Я сталкивался с подобной проблемой.
Мои наблюдения:
1) Критическое число юзеров -- около 500 человек. Более - начинаются описанные автором проблемы.
2) Разбивал работу скрипта по 50 получателей именно так, как советует bars80080.
Реально помогает. При кол-ве более 1500 получателей начинаются глюки, даже с использованием разбиения по 50 получателей. Проблему не решил никак.
PM MAIL WWW ICQ   Вверх
begin
Дата 17.3.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Только что пришел ответ от хостера:
Цитата

Никто специально не прибивает процессы, если конечно они сервер не вешают, но не думаю, что это Ваш случай.
Если в скрипте есть возможность разбейте рассылку на несколько частей. Лимит есть на 300 писем в час. Думаю идеально если письма в рамках лимита будут рассылаться партиями по 50 в течении часа. Тогда подвисаний никаких не будет.

То есть получается, что мало того, что я должен разбить рассылку по 300 писем в час, но еще и эти 300 писем придется отсылать порциями по 50 писем  smile 
Сайт то не мой - а моих заказчиков.. Как я им объясню, что их человеку придется отсылать письма так тяжко? Не поймут   smile 
PM MAIL   Вверх
bars80080
Дата 17.3.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



если делать всё как надо, то придётся писать скрипт, который сам будет подготавливать данные по нажатию одной кнопки, а за ходом выполнения тогда должна следить cron, но это если поддерживает система

однако, сдаётся мне, что ты заметил лимит только на >800, следовательно, можно не заморачиваться, а делать продуктивную систему, способную отправить всё сразу, а если не получается, тут же совершающую новый подход
PM MAIL WWW   Вверх
Canarat
Дата 17.3.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 11.3.2008
Где: Каспий

Репутация: 5
Всего: 5



Стандартное решение в таких случаях - порционная отправка + cron'ирование скрипта, как правильно здесь заметили. А вот заставлять человека, работающего с сайтом, жать на кнопочки - это нарушение профессиональной этики и вообще всех возможных неписанных правил )
PM MAIL   Вверх
begin
Дата 17.3.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



значит щас буду изучать cron , потому что я тоже иного выхода не вижу

PM MAIL   Вверх
eee
Дата 20.10.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 14.4.2008
Где: ХарьковCity

Репутация: нет
Всего: 1



Снова поднимаю тему. Проблема похожая. За исключением результатов - страница не виснет.
Суть в том, что выполняется массовая рассылка пользователям. 
Пользователи уже до этого выбраны из базы и занесены в INI-файлы в формате email = "hash".

Скрипт:
Код

function send($array) {
    global $sender;
    $i = 1;
    foreach ($array as $email=>$hash) {
     $email = trim(strtolower($email));
        $hash  = trim(strtolower($hash));
        if (valid_email($email)) {
         $hash = md5($email . $hash);
            $text = str_replace('%HASH%', $hash, trim(stripslashes(urldecode($_POST['mail']))));
            $subject = trim(stripslashes(urldecode($_POST['subject'])));
            $headers = 'From: ' . $sender . "\r\n" .
                       'Content-type: text/html; charset=windows-1251' . "\r\n";
         if (!mail($email, $subject, $text, $headers)) {
             echo '<pre style="border:1px solid #d5d5d5;padding:10px;">';
                echo 'Line: ' . $i;
                echo '<br />';
                var_dump($email);
                echo '<br />';
                var_dump($subject);
                echo '<br />';
                var_dump($headers);
                echo '<br />';
                echo date("r");
                echo '<br />';
                print_r(getallheaders());
                echo '</pre>';
                exit();
            }
        }
        $i++;
    }
    return count($array);
}

Как вы уже догадались, var_dump()-ы там находятся никак не случайно. Дело в том, что функция ведет себя слегка странно - вылетает на произвольном email-е.

Код

Line: 4  - номер эл почты (по порядку) в файле
string(21) "[email protected]" (получатель)

string(18) "тест работодателей" (тема письма)

string(97) "From: Отправитель   (заголовки переданные маил())
Content-type: text/html; charset=windows-1251
"

Tue, 20 Oct 2009 12:27:20 +0300  - все заголовки переданные сервером
Array
(
    [Host] => site.domain.ua
    [User-Agent] => Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    [Accept] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [Accept-Language] => ru,en-us;q=0.7,en;q=0.3
    [Accept-Encoding] => gzip,deflate
    [Accept-Charset] => windows-1251,utf-8;q=0.7,*;q=0.7
    [Keep-Alive] => 300
    [Connection] => keep-alive
    [Referer] => http://site.domain.ua/admin.php?p=nospam
    [Cookie] => iua=1; b=b; vxnews=6; PHPSESSID=a7d0293f5ca52018dcd99720ded3424e
    [Content-Type] => application/x-www-form-urlencoded
    [Content-Length] => 6377
)



В скрипте берется файл, парсится через parse_ini_file() и полученный массив передается функции send(), которая уже шаманит как хочет.

INI-файлов 3 — 3 вида пользователей.
В одном  ~13000—15000 пользователей,
Во втором ~2500,
В третьем ~100.

Прошу вашей помощи, потому что я уже ничего не могу понять. Спасибо.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.