PHP Любой способ «Эхо, отображение, печать» сообщения в середине цикла?

#php #while-loop

#php #во время цикла

Вопрос:

Мне нужно заставить мою страницу PHP отображать сообщение после каждого раунда в цикле .. не в конце цикла .. поскольку я запускаю бесконечный цикл. цель состоит в том, что у меня есть скрипт внутри страницы, который запускает команду на сервере .. принимает выходные данные и сравнивает данные с инструкцией IF, если он проверяет, отображает сообщение .. если нет .. он спит в течение трех секунд и снова запускает цикл. проблема в том, что когда я запускаю файл php из командной строки на сервере, он делает именно то, что должен делать .. отображает сообщение каждые 3 секунды (не нажимая кнопку подтверждения).. но когда я запускаю его в браузере, он ничего не отображает (он ожидает завершения цикла!) не уверен, что мой приведенный ниже пример будет служить этой цели.

 <?php
while (1==1) {
  $answer = shell_exec ("COMMAND'");
  list($src, $app, $cid, $non, $flag, $dur, $exten) = explode("!", $answer);

  if ($cid > 0) {
    echo "<script language='javascript'>
      var r=confirm('You have a call from $cid: Show Data?') 
      if (r==true)
      {
        OPEN A WEB PAGE INSIDE AN IFRAME
      }
    </script>";

    //header( 'refresh: 15; url=monit.php' );
    flush();
    sleep(10);
  }
  else {
    //header( 'refresh: 1; url=monit.php' );
    sleep(1);
  }
}
?>
  

Пожалуйста, обратите внимание, что я пытался использовать функцию «header ()» для перезагрузки страницы, однако я не хочу перезагружать саму страницу (создаст осложнения внутри родительской страницы)

Есть предложения?

Комментарии:

1. Пожалуйста, сделайте отступ в своем коде. Я едва могу его прочитать. Что касается вашего вопроса, нет. Вы должны сделать это с помощью AJAX, поскольку PHP не может печатать такой текст (браузер обычно отключается).

2. Выключите zlib / gzip выключите, если вы этого еще не сделали.

3. вы когда-нибудь использовали ob_start()?

Ответ №1:

Есть несколько вещей, которые нужно проверить, упомянутых на странице руководства для функции сброса:

flush() может быть не в состоянии переопределить схему буферизации вашего веб-сервера, и это никак не влияет на буферизацию на стороне клиента в браузере


Несколько серверов, особенно на Win32, все равно будут буферизировать выходные данные вашего скрипта, пока он не завершится, прежде чем передавать результаты в браузер.


Серверные модули для Apache, такие как mod_gzip, могут выполнять собственную буферизацию, что приведет к тому, что функция flush() не приведет к немедленной отправке данных клиенту.

Есть также некоторые параметры конфигурационного файла, которые необходимо проверить, упомянутые в комментариях

Если функция flush() не работает. Вы должны установить следующие параметры в php.ini, например:

output_buffering = Off
;output_handler =
zlib.output_compression = Off
;zlib.output_handler =

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

Ответ №2:

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

Таким образом, вероятно, было бы лучше использовать AJAX, например:

ping.php

 $answer = shell_exec('COMMAND');
$r = array();
list($r['src'], $r['app'], $r['cid'], $r['non'], $r['flag'], $r['dur'], $r['exten']) = explode("!", $answer);
if($r['cid'] > 0)
  $r['success'] = true;
else
  $r['success'] = false;
echo json_encode($r);
  

Скрипт в вашем общедоступном файле HTML / PHP

 <script type="text/javascript">
  // If you're using jQuery...
  var ping = function() {
    $.ajax('ping.php', {
      dataType: 'json',
      success: function(data) {
        if(data.success amp;amp; confirm('You have a call from '   data.cid   ': show data>'))
          $('iframe').attr('src', 'new_page.php');
      }
    });
  };
  setInterval(ping, 3000);
</script>
  

Ответ №3:

Поместите это в свой htaccess (повороты gzip):

 SetEnv no-gzip dont-vary
  

и чтобы повторить сообщение и очистить выходной буфер, сделайте это в своем цикле:

 echo $msg;
ob_flush();
flush();