|
|
|
| пдскажите как можно реализовать прогрес бар для скрипта отправки почтовой рассылки?
Имеется сайт, примерно 10.000 зарегитсрированных пользователей с подтрержденными емеилами. Я хочу написать срипт который будет брать из MySQL базы почтовые адреса и по ним отправлять рассылку. С этим проблем нет, хотя иногда отваливается по таймауту сайт. Мне необходимо как-нибудь реализовать отображение сколько писем отослано/осталось отослать ну или полосочку типо 89% отправлено. Наверное надо делать как нибудь с помощью фреймов? Но как выводить данные посередине цикла отправки? | |
|
|
|
|
|
|
|
для: 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.'%');
}
?> | |
|
|
|
|
|
|
|
для: RESPONSOR
(04.07.2009 в 23:45)
| | Как минимум имеет смысл проверять предыдущее значение индикатора, чтобы не генерировать код запроса JS слишком часто.
Кроме того, можно воспользоваться AJAX, применяя в качестве промежуточной транспортной среды БД. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2009 в 00:01)
| | Это к тому, что do_send_mail и show_percent могут выполниться в параллельных потоках, т.е. не совсем так, как Вы (учитываю замечания PAT) представляете. | |
|
|
|
|
|
|
|
для: GeorgeIV
(05.07.2009 в 00:08)
| | что я несовсем так представляю? | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2009 в 00:16)
| | Это уже не к Вам было, а к автору топика. К сожалению, форум автоматически подставляет ответ к последнему вопросу, не всегда успеваеншь это отследить, не обижайтесь, к Вашей компетенции вопросов нет. | |
|
|
|
|
|
|
|
для: GeorgeIV
(05.07.2009 в 01:01)
| | старый анекдот.
Час пик, автобус, дикая давка в салоне. Диалог:
- Молодой чаловек! Вы своими очками царапаете мне колготки!
- Я?! Да как? Да что Вы такое говорите?!
- Нет. Не Вы, а Вы... Вы - продолжайте. | |
|
|
|
|
|
|
|
для: GeorgeIV
(05.07.2009 в 00:08)
| | ну мне не так важно как они выполнятся, если что можно функцию вывода процентов запихнуть в функцию отправки писем, мне главное понять принцип как устроить эту рассылку чтобы показывался статус и не выбивало по таймауту, если можно в примерами. Можно попробовать через фрейм и разбить все письма на блоки по 5 адресов например и делать чтото типо рефреша каждые 20 секунд блока с rassilka.php?block_id=$n ; $n++ чтобы след блок отсылал следующим 5 адресатам | |
|
|
|
|
|
|
|
для: RESPONSOR
(05.07.2009 в 01:07)
| | если сервер Ваш - увеличьте тайм-аут на время работы скрипта. | |
|
|
|
|
|
|
|
для: 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% больше.... | |
|
|
|
|
|
|
|
для: RESPONSOR
(05.07.2009 в 13:27)
| |
echo "\r\n";
ob_flush();
flush();
|
Хотя и это может не спасти. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2009 в 13:34)
| | все-равно сначала белый экран несколько секунд и потом сразу 100%.. | |
|
|
|
|
|
|
|
для: 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
(04.07.2009 в 20:46)
| | в общем похоже что сделать реальный каунтер отправки писем не получится. Отправка команды mail() в цикле проходит быстро, а вот исполнение самого mail() длится несколько минут. И письма приходят не по порядку 1 2 3 4 5 6 а както рандомно 1 2 3 7 4 6 5 9 8 10 11 и тд... Получается каунтер можно сделать только выборки адресов из базы, а сама отправка почты будет идти в фоновом режиме. | |
|
|
|
|
|
|
|
для: RESPONSOR
(05.07.2009 в 18:35)
| | А другого и не требуется. Главное чтобы все mail() сработали. А там дальше уже юрисдикция sendmail (или чего-то ещё). | |
|
|
|
|
|
|
|
для: responsor
(04.07.2009 в 20:46)
| | Да уж, идея была хорошая но потом узнал про ограничение на отправку писем хостера, так что видимо 12.000 зарегистрированных пользователей письма сразу не получат) В час можно 200 писем чтоли отправлять, это неделю всем рассылать письма придется, не айс..) | |
|
|
|
|
|
|
|
для: responsor
(06.07.2009 в 17:31)
| | Мне вот крайне интересно узнать, откуда у Вас 12000 зарегистрированных пользователей, давших явное разрешение себя спамить? | |
|
|
|