Скрипт массовой рассылки э-маилов

Тема в разделе "PHP", создана пользователем webnet, 1 апр 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. webnet

    webnet Создатель

    Регистр.:
    1 дек 2006
    Сообщения:
    19
    Симпатии:
    5
    Привет всем.
    Есть скрипт , он выдергивает маилы пользователей из базы данных и потом функцией делает отправку . Беда заключается в том , что в базе 15к пользователей и когда начинаеться отправка миалов , сервер мягко говоря виснет . Может кто дописать скрипт , что бы отправлял по 10-15 писем за раз , отдыхал секунд 30 и опять отправлял ?
    PHP:
    <?
    require_once (
    "include/bittorrent.php");
    dbconn ();
    if (
    get_user_class() < UC_SYSOP) die('Access denied, u\'re not sysop'); 

    global 
    $SITENAME$SITEEMAIL;
    $res mysql_query "SELECT email FROM users" ) or sqlerr __FILE____LINE__ );
    $counter mysql_affected_rows ();
    while ( 
    $a mysql_fetch_assoc $res ) ) {
        
        
    $subject $_POST ['subject'];
        if (! 
    $subject)
            
    stderr $lang ['error'], "Пожалуста, введите тему!" );
        
        
    $msg $_POST ['msg'];
        if (! 
    $msg)
            
    stderr $lang ['error'], "Введите текст сообщения!" );
        
        
    $message = <<<EOD
    $msg
    EOD;
        
    sent_mail $a ["email"], $SITENAME$SITEEMAIL$subject$messagefalse );
    }
    stdhead "Спамилка" );
    stdmsg "Успешно..""Рассылка завершена. Отправлено <b>$counter</b> сообщений" );
    stdfoot ();
    ?>
    Буду очень благодарен . :bc:
     
  2. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Так зачем 30 секунд после 15ти, если можно 2 секунды после каждого? :)


    Вставь sleep(2); сразу после sent_mail() и вуаля.
     
  3. Stern87

    Stern87 Создатель

    Регистр.:
    8 дек 2007
    Сообщения:
    15
    Симпатии:
    1
    А также добавьте на всякий случай строки
    ini_set('output_buffering', 0);
    set_time_limit(0);
    ob_implicit_flush();
    часть из них будет сразу выводит на экран то, что вам надо, а set_time_limit(0) не прервёт скрипт на пол-пути.
     
  4. saen

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    Дописывать я не буду, но могу подсказать что если письма отправляютя через phpmail, то есть смысл делать отправку через pop или smtp почтовые порты, а программную часть разделить на нити для эмуляции многопоточности.
     
  5. sh4m3

    sh4m3 Писатель

    Регистр.:
    28 мар 2010
    Сообщения:
    5
    Симпатии:
    0
    PHP:
    <? 
    // работа скрипта не будет прервана
    set_time_limit(0);
    require_once (
    "include/bittorrent.php"); 
    dbconn (); 
    if (
    get_user_class() < UC_SYSOP) die('Access denied, u\'re not sysop');  

    global 
    $SITENAME$SITEEMAIL
    $res mysql_query "SELECT email FROM users" ) or sqlerr __FILE____LINE__ ); 
    $counter mysql_affected_rows (); 
    $i=0;
    while ( 
    $a mysql_fetch_assoc $res ) ) { 
         
    $i++;
        
    $subject $_POST ['subject']; 
        if (! 
    $subject
            
    stderr $lang ['error'], "Пожалуста, введите тему!" ); 
         
        
    $msg $_POST ['msg']; 
        if (! 
    $msg
            
    stderr $lang ['error'], "Введите текст сообщения!" ); 
         
        
    $message = <<<EOD 
    $msg 
    EOD

        
    sent_mail $a ["email"], $SITENAME$SITEEMAIL$subject$messagefalse ); 

    // спим 30 сек
        
    if ($i%15==0)  { 
           
    // сбрасываем на экран накопленный буфер перед сном
            
    flush();
            
    sleep(30);
        }

    stdhead "Спамилка" ); 
    stdmsg "Успешно..""Рассылка завершена. Отправлено <b>$counter</b> сообщений" ); 
    stdfoot (); 
    ?>
     
Статус темы:
Закрыта.