Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Progress bar для почтовой рассылки
 
 автор: responsor   (04.07.2009 в 20:46)   письмо автору
 
 

пдскажите как можно реализовать прогрес бар для скрипта отправки почтовой рассылки?
Имеется сайт, примерно 10.000 зарегитсрированных пользователей с подтрержденными емеилами. Я хочу написать срипт который будет брать из MySQL базы почтовые адреса и по ним отправлять рассылку. С этим проблем нет, хотя иногда отваливается по таймауту сайт. Мне необходимо как-нибудь реализовать отображение сколько писем отослано/осталось отослать ну или полосочку типо 89% отправлено. Наверное надо делать как нибудь с помощью фреймов? Но как выводить данные посередине цикла отправки?

  Ответить  
 
 автор: RESPONSOR   (04.07.2009 в 23:45)   письмо автору
 
   для: responsor   (04.07.2009 в 20:46)
 

пока приходит в голову только чтото такое:

<?
set_time_limit(500);
$total = 10000; // emails total
?>

<script type="text/javascript">
function show_percent(persent){
document.getElementById('progressBar').innerHTML = persent;
}
</script>
<h1>Progress bar</h1>
<span id="progressBar"></span>

<?
function show_percent($persent)
{
echo '<script>show_percent("'.$persent.'");</script>';
}

for($i = 0; $i < $total; $i++)
{

$persent = 100 - floor( (($total-$i)*100) / $total );
do_send_mail($email); // на это модно не обращать внимания, просто функция отправки письма.
show_percent($persent.'%');

}
?>

  Ответить  
 
 автор: Trianon   (05.07.2009 в 00:01)   письмо автору
 
   для: RESPONSOR   (04.07.2009 в 23:45)
 

Как минимум имеет смысл проверять предыдущее значение индикатора, чтобы не генерировать код запроса JS слишком часто.
Кроме того, можно воспользоваться AJAX, применяя в качестве промежуточной транспортной среды БД.

  Ответить  
 
 автор: GeorgeIV   (05.07.2009 в 00:08)   письмо автору
 
   для: Trianon   (05.07.2009 в 00:01)
 

Это к тому, что do_send_mail и show_percent могут выполниться в параллельных потоках, т.е. не совсем так, как Вы (учитываю замечания PAT) представляете.

  Ответить  
 
 автор: Trianon   (05.07.2009 в 00:16)   письмо автору
 
   для: GeorgeIV   (05.07.2009 в 00:08)
 

что я несовсем так представляю?

  Ответить  
 
 автор: GeorgeIV   (05.07.2009 в 01:01)   письмо автору
 
   для: Trianon   (05.07.2009 в 00:16)
 

Это уже не к Вам было, а к автору топика. К сожалению, форум автоматически подставляет ответ к последнему вопросу, не всегда успеваеншь это отследить, не обижайтесь, к Вашей компетенции вопросов нет.

  Ответить  
 
 автор: Trianon   (05.07.2009 в 01:41)   письмо автору
 
   для: GeorgeIV   (05.07.2009 в 01:01)
 

старый анекдот.
Час пик, автобус, дикая давка в салоне. Диалог:
- Молодой чаловек! Вы своими очками царапаете мне колготки!
- Я?! Да как? Да что Вы такое говорите?!
- Нет. Не Вы, а Вы... Вы - продолжайте.

  Ответить  
 
 автор: RESPONSOR   (05.07.2009 в 01:07)   письмо автору
 
   для: GeorgeIV   (05.07.2009 в 00:08)
 

ну мне не так важно как они выполнятся, если что можно функцию вывода процентов запихнуть в функцию отправки писем, мне главное понять принцип как устроить эту рассылку чтобы показывался статус и не выбивало по таймауту, если можно в примерами. Можно попробовать через фрейм и разбить все письма на блоки по 5 адресов например и делать чтото типо рефреша каждые 20 секунд блока с rassilka.php?block_id=$n ; $n++ чтобы след блок отсылал следующим 5 адресатам

  Ответить  
 
 автор: GeorgeIV   (05.07.2009 в 01:09)   письмо автору
 
   для: RESPONSOR   (05.07.2009 в 01:07)
 

если сервер Ваш - увеличьте тайм-аут на время работы скрипта.

  Ответить  
 
 автор: RESPONSOR   (05.07.2009 в 13:27)   письмо автору
 
   для: GeorgeIV   (05.07.2009 в 01:09)
 

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


<?php

set_time_limit
(500);
$total 100;

    for(
$i 0$i <= $total$i++)
    {
        

        
$persent 100 floor( (($total-$i)*100) / $total );
        echo 
"
        <script>document.getElementById('progressBar').innerHTML = '
$persent';</script>";
                           
do_send_mail($i);

        
    }
?>


то выводится 100 записей <script>document.getElementById('progressBar').innerHTML = '$persent';</script> ну в принципе так и должно быть но они выводятся сразу, а не с промежутками, тоесть если бы вместо do_send_mail($i); стояло sleep(1); то сначала 100 секунд страница грузилась бы а потом сразу показало бы 100%. а не так что каждую секунду показывало на 1% больше....

  Ответить  
 
 автор: Trianon   (05.07.2009 в 13:34)   письмо автору
 
   для: RESPONSOR   (05.07.2009 в 13:27)
 

echo "\r\n";
ob_flush();
flush();


Хотя и это может не спасти.

  Ответить  
 
 автор: RESPONSOR   (05.07.2009 в 13:59)   письмо автору
 
   для: Trianon   (05.07.2009 в 13:34)
 

все-равно сначала белый экран несколько секунд и потом сразу 100%..

  Ответить  
 
 автор: RESPONSOR   (05.07.2009 в 17:22)   письмо автору
 
   для: RESPONSOR   (05.07.2009 в 13:59)
 


<?php
$num 
5000

for(
$cur 0$cur <= $num$cur++) 

    echo(
"\n\r $cur "); 
    
usleep(10000);
    
flush(); 
}
?>


вот тут получилось добиться чего-то похожего на постепенный вывод статуса в браузер, только пачками по 500-600 значений...

  Ответить  
 
 автор: RESPONSOR   (05.07.2009 в 18:35)   письмо автору
 
   для: responsor   (04.07.2009 в 20:46)
 

в общем похоже что сделать реальный каунтер отправки писем не получится. Отправка команды mail() в цикле проходит быстро, а вот исполнение самого mail() длится несколько минут. И письма приходят не по порядку 1 2 3 4 5 6 а както рандомно 1 2 3 7 4 6 5 9 8 10 11 и тд... Получается каунтер можно сделать только выборки адресов из базы, а сама отправка почты будет идти в фоновом режиме.

  Ответить  
 
 автор: Саня   (05.07.2009 в 19:28)   письмо автору
 
   для: RESPONSOR   (05.07.2009 в 18:35)
 

А другого и не требуется. Главное чтобы все mail() сработали. А там дальше уже юрисдикция sendmail (или чего-то ещё).

  Ответить  
 
 автор: responsor   (06.07.2009 в 17:31)   письмо автору
 
   для: responsor   (04.07.2009 в 20:46)
 

Да уж, идея была хорошая но потом узнал про ограничение на отправку писем хостера, так что видимо 12.000 зарегистрированных пользователей письма сразу не получат) В час можно 200 писем чтоли отправлять, это неделю всем рассылать письма придется, не айс..)

  Ответить  
 
 автор: Trianon   (06.07.2009 в 20:23)   письмо автору
 
   для: responsor   (06.07.2009 в 17:31)
 

Мне вот крайне интересно узнать, откуда у Вас 12000 зарегистрированных пользователей, давших явное разрешение себя спамить?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования