Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: sleep в цикле foreach
Форумы портала PHP.SU » » Вопросы новичков » sleep в цикле foreach

Страниц (1): [1]
 

1. Lipser - 21 Августа, 2014 - 15:57:39 - перейти к сообщению
Добрый день всем!
Вторую неделю изучаю php )) Какие то непонятки получается решить самому при более внимательном изучении кода, какие то не могу понять совсем, поэтому прошу помощи.

Сейчас столкнулся с непонятным для меня поведением sleep в цикле foreach. Задача скрипта рассылать клиентам сообщения, не превышая разрешенное хостером в час. Для этого в цикл рассылки был вставлен оператор sleep:

CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2.   if ( (isset($_POST['submit'])) && (isset($_FILES['file'])) && ($_FILES['file']['name'] != null) )
  3.  {
  4.      
  5.         // Формируем массив с адресами email для рассылки
  6.         $fileString = file_get_contents($_FILES['file']['tmp_name']);
  7.         $emailsArray = explode("\n",$fileString);
  8.  
  9.         // Подсчитываем кол-во адресов
  10.         $emailsCount = count($emailsArray);
  11.         $emailsCountTotal = $emailsCount;
  12.  
  13.         // Отправляем сообщения
  14.         foreach($emailsArray as $email)
  15.         {
  16.         echo 'Осталось отправить '.$emailsCount.' из '.$emailsCountTotal.'. Отправляем сообщение для: '.$email.'<br />';
  17.         mail($email,$_POST['subject'],$_POST['message']);
  18.         sleep(5);
  19.         $emailsCount--;
  20.         }
  21. }      
  22. ?>
  23.  


Подразумевается, что после отправки каждого сообщения будет выдерживаться пауза в 5 секунд, после чего цикл продолжится. На самом деле это не работает: после нажатия submit браузер дает понять что все еще продолжается загрузка в течение имхо больше 5 секунд, после чего скрипт отправляет все сообщения разом.
Подскажите, что я не так делаю ?

P.s. Скрипт пока черновой, без проверок и прочих прелестей, сейчас надо только отработать механизм.
2. esterio - 21 Августа, 2014 - 16:01:15 - перейти к сообщению
потому-что вывод буферизируеться самим PHP. когда он отработал то и виводит все зразу. Кажись поможет http://ua2.php.net/manual/ru/function.flush.php
3. Tyoma5891 - 21 Августа, 2014 - 16:07:33 - перейти к сообщению
запускайте по крону или ему подобным...
4. Lipser - 21 Августа, 2014 - 16:09:12 - перейти к сообщению
Так уже пробовал, не помогает. Как правильно сделать ?

И сразу еще одна нерешенная проблема - как выводить сообщения из цикла об оставшихся отправках в одной и той же строке ? иначе при получается некрасивый длинный листинг из сообщений...
(Добавление)
[quote=Tyoma5891][/quote]
А как по крону ? Если у меня в списке будет допустим 120 адресов, а ограничение у хостера до 100 сообщений в час ? Он же мне все равно все разом отправит...
5. Tyoma5891 - 21 Августа, 2014 - 16:16:01 - перейти к сообщению
Lipser пишет:

А как по крону ? Если у меня в списке будет допустим 120 адресов, а ограничение у хостера до 100 сообщений в час ? Он же мне все равно все разом отправит...

заносите список в эксель или в бд в табличку и вперед) а в кроне настраиваете периодичность запуска скрипта)
6. Lipser - 21 Августа, 2014 - 16:37:16 - перейти к сообщению
Tyoma5891 пишет:
заносите список в эксель или в бд в табличку и вперед

Не, это для меня пока mission imposible ))
у меня нет конкретной задачи это реализовать, я для себя научиться хочу...
7. Tyoma5891 - 21 Августа, 2014 - 16:39:26 - перейти к сообщению
Lipser пишет:
Tyoma5891 пишет:
заносите список в эксель или в бд в табличку и вперед

Не, это для меня пока mission imposible ))
у меня нет конкретной задачи это реализовать, я для себя научиться хочу...

так это как раз и будет хорошим обучением и познованием нового Улыбка
8. Lipser - 21 Августа, 2014 - 16:55:58 - перейти к сообщению
начинает приходить понимание, что если адресов будет 1000, то на выполнение скрипта уйдет 10 часов, при этом браузер нельзя закрывать ..
Как это правильно сделать через cron? )) там какая логика работы? Браузер будет открываться или передаваться на выполнение будет сам скрипт php?
9. Tyoma5891 - 21 Августа, 2014 - 17:01:16 - перейти к сообщению
если через cron браузер Вам не нужен)
10. Ch_chov - 21 Августа, 2014 - 17:15:55 - перейти к сообщению
Отмечайте клиентов которым уже отправили сообщение. Тогда можно будет каждый час отправлять определённое количество писем одновременно, без sleep.

 

Powered by ExBB FM 1.0 RC1