Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
1

Отображение данных на сайте по мере выполнения php-скрипта

23.05.2014, 20:30. Показов 7286. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер! Интересует такой вопрос. Есть примитивный php-скрипт, который в цикле анализирует базу адресов подписчиков из txt-файла и делает рассылку на каждый адрес по отдельности. Почему не всем сразу? - из собственных соображений. В добавок, для каждого (не)отправленного сообщения он выводит результат и время отправки. Ну, для статистики. На практике, конечно, получается что всё это добро выводится на экран только после прогрузки скрипта и, соответственно, отправки ВСЕХ сообщений, что довольно неудобно. Хотелось бы видеть на странице рез-ты работы сразу после отправки каждого письма. Вот и вопрос, как можно это дело забубенить? Ajax'ом с помощью jQuery? Как тогда это сделать грамотнее? Буду благодарен за любую помощь.
Скрипт самой рассылки выглядит примерно так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
//[S]Здесь могла быть ваша реклама[/S] Тут было не интересное формирование сообщения
$filename = "База.txt";
if(file_exists($filename))
{
    $database = fopen($filename, "r");
    while(!feof($database))
    {
        $to = chop(fgets($database, 4096));
        $isSuccess = mail($to, $subject, $message, $headers);
        echo date('h:i:s')." ";
        if($isSuccess) echo $to.' Письмо отправлено'.'<br>'; else echo $to.' Письмо не отправлено'.'<br>';
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2014, 20:30
Ответы с готовыми решениями:

Загрузка контента по мере выполнения скрипта
Добрый вечер. Не подскажете случаем &lt;input type=&quot;button&quot; value=&quot;РАЗБИТЬ НА ПАКЕТЫ&quot;...

Поэтапный вывод по мере выполнения скрипта
Добрый день! Есть очень долгий скрипт, обрабатывающий форму. Работает 6-7 минут, поэтому я...

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

Как получить данные из скрипта по мере выполнения
Есть fetch &lt;script&gt; const btn = document.querySelector('.load'); ...

9
65 / 64 / 33
Регистрация: 25.02.2014
Сообщений: 229
23.05.2014, 21:05 2
разместите на странице фрейм, в котором будет выполняться скрипт и выводить результаты (не используйте буферизацию).
0
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
23.05.2014, 21:31  [ТС] 3
А поподробнее можно? Насколько я понимаю, при текущем методе реализации даже с фреймом данные будут выводиться на экран только после выполнения сервером всего скрипта.

Добавлено через 20 минут
Немного уточню суть: эта страница не содержит никаких данных, кроме результатов текущей рассылки, поэтому никакие другие элементы сайта отображать во время процесса не нужно. Я просто хочу, чтобы этот результат
PHP
1
"if($isSuccess) echo $to.' Письмо отправлено'.'<br>'; else echo $to.' Письмо не отправлено'.'<br>';"
отображался сразу после отправки КАЖДОГО письма. Т.е. получается так: скрипт парсит базу, берет из нее адрес и отправляет на него письмо, тут же на экране (странице) отображается время отправки и ее результат (отправлено или нет). Затем скрипт берет следующий адрес, отправляет на него письмо и добавляет на страницу время отправки и ее результат уже для этого письма, и т.д.
С моей текущей реализацией данные выводятся за 1 раз, когда скрипт выполнен и его результат передан сервером на клиентскую часть. А это, на минуту, 1-2 сек. на отправку каждого письма. Т.е. с базой адресов этак 500, браузер ожидает выполнения скрипта 8-16 минут и все это время я не знаю отправлены ли сообщения или произошел какой-нибудь сбой. Добавление информации на страницу о каждом отправлении в реал-тайме, вот что я хочу, ребята. Можно такое забубенить?
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
24.05.2014, 10:01 4
Цитата Сообщение от Rized Посмотреть сообщение
Можно такое забубенить?
можно через веб-сокеты, ну или ajax-ом каждый раз отправлять и смотреть сколько отправилось. Отдавать кусками не получится, вы работает по HTTP протоколу, отдал ответ и забыл.
0
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
24.05.2014, 12:29  [ТС] 5
можно через веб-сокеты, ну или ajax-ом каждый раз отправлять и смотреть сколько отправилось.
Алгоритм получается такой: скрипт jQuery отправляет запрос на сервер, передавая ему адрес получателя письма, php-скрипт отправляет письмо и возвращает результат отправки клиентской части. Верно? Тогда ещё статейки по этой теме не подскажете? Всё то, что по теме читал, было довольно расплывчатым.
0
65 / 64 / 33
Регистрация: 25.02.2014
Сообщений: 229
25.05.2014, 07:37 6
Цитата Сообщение от Rized Посмотреть сообщение
А поподробнее можно? Насколько я понимаю, при текущем методе реализации даже с фреймом данные будут выводиться на экран только после выполнения сервером всего скрипта.
Несколько я помню. если вы не используете буферизацию вывода и сжатие трафика, то командами типа echo данные отправляются немедленно.
Например у меня основная страница выглядит так:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<html>
<head>
  <title>Syncman projects</title>
  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
  <base href="/"/>
  <link rel="stylesheet" href="styles/main.css" type="text/css" />
</head>
<body id='popup'>
 
  <div id="wrapper">
 
    <div id="head">
      <img src="https://www.cyberforum.ru/images/logo.small.gif"  width='159' height='40' alt='logo' id='logo'/>
    </div>
  
    <fieldset>
       <legend>Synchronization...</legend>
        <?php
          echo "<iframe width='100%' height='70px' src='/projects/start_sync?{$id}{$ignore_externals}'></iframe>";
        ?>
    </fieldset>
  
  </div>
</body>
</html>
Некоторый дизайн с фреймом по середине. Далее скрипт /projects/start_sync по мере выполнения выводит данные так:
PHP
1
2
3
4
5
6
  protected function _out($msg)
  {
    echo $msg;
    echo "<script>window.scrollTo(0,document.height);</script>";
    flush();
  }
Помоему эфект получается в точности такой как тебе требуется. У меня скрипты завернутые, поэтому я после вывода принудительно выполняю очистку буфера вывода flush. А вообще должно работать и без нее.
0
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
25.05.2014, 12:12  [ТС] 7
Цитата Сообщение от vasiatka Посмотреть сообщение
Помоему эфект получается в точности такой как тебе требуется. У меня скрипты завернуты
Неистово благодарю! Сегодня попробую сей метод реализации и отпишусь по результатам.

Добавлено через 5 минут
А ещё вопрос по этой записи
.../start_sync?{$id}{$ignore_externals}
Эти переменные, id и ignore_externals, какие-то конкретные значения должны содержать? Или это так, общий пример и они не важны?
0
65 / 64 / 33
Регистрация: 25.02.2014
Сообщений: 229
25.05.2014, 13:40 8
Лучший ответ Сообщение было отмечено Rized как решение

Решение

Цитата Сообщение от Rized Посмотреть сообщение
Эти переменные, id и ignore_externals, какие-то конкретные значения должны содержать? Или это так, общий пример и они не важны?
Я вам привел кусок шаблона страницы реального проекта синхронизации кода из svn, git и тп. с боевым проектом (по нажатию одной кнопки, забирается код из системы контроля версий, гоняются тесты, если все ок, вычисляются изменения и отправляются на боевой сервер).
И /projects/start_sync?{$id}{$ignore_externals} ни что иное как адрес запуска скрипта, результаты которого выводятся во фрейме (параметры {$id}{$ignore_externals} формируются динамически и грузятся в шаблон, шаблонизатор на выводе подставляет туды нужные значения). Не загонайтесь Для вас это адрес вашего скрипта.
0
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
26.05.2014, 14:35  [ТС] 9
В общем, переписал всё дело по аналогии с примером выше. Положительного результата не получил. Что интересно - испытывал работу flush() в другом коде - работает. Подставляю в тот же код функцию отправки писем - не работает. Видать, дело в mail(params)
Ещё варианты есть? Я пока вывожу результат в текстовый файл, но всё же хотелось бы чего-нибудь менее "костыльного".
0
1 / 1 / 0
Регистрация: 23.05.2014
Сообщений: 15
27.05.2014, 19:04  [ТС] 10
В конечном счёте сделал всё через Ajax. Алгоритм такой: на основной странице размещается Ajax-вызов "рассыльщика"(php), который записывает адрес получателя, время отправки и результат в txt-файл, а по завершении рассылки возвращает ее статус. Прямо за ним следует вызов зацикленной (рекурсивно, через setTimeout()) функции, обрабатывающей Ajax-запрос 2му php-скрипту, который парсит txt-файл с инф. о рассылке и возвращает все данные из него jQuery, который "рефреширует" на их основе текст на экране. В самой JS-функции разлеглись парочка управляющих рекурсией If'ов.
Это так, если кому интересно будет.
Всем спасибо, особенно vasiatka, а я пойду дебажить код
0
27.05.2014, 19:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2014, 19:04
Помогаю со студенческими работами здесь

Постепенное добавление данных на страницу по мере получение из скрипта
Здравствуйте, как реализовать постепенное добавление данных, т.к их очень много, получается что...

Отображение выполнения серверного скрипта
Имеется серверный скрипт. Он выполняется достаточно долго. Как скрасить пользователю процесс...

Вывод данных в форму по мере выполнения программы
Здравствуйте, уважаемые спецы! У меня такая проблемка: программа проверяет данные в большой...

Завершение выполнение php скрипта, после выполнения if
Здравствуйте уважаемые. Незнаю как правильно написать вопрос, Задача такая: Есть блок if - и еще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru