PHP Любой способ «Echo, Display, Print» сообщение в середине цикла? - PullRequest
1 голос
/ 20 октября 2011

Мне нужно заставить мою страницу 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 ()" для перезагрузки страницы, однако я не хочу перезагружать саму страницу (это создаст сложности внутри родительской страницы)

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

Ответы [ 3 ]

1 голос
/ 20 октября 2011

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

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


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


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

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

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

output_buffering = Off<br> ;output_handler =<br> zlib.output_compression = Off<br> ;zlib.output_handler =

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

0 голосов
/ 20 октября 2011

Перетащите это в свой htaccess (обороты gzip):

SetEnv no-gzip dont-vary

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

echo $msg;
ob_flush();
flush();
0 голосов
/ 20 октября 2011

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

Таким образом, было бы лучше использовать 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 && confirm('You have a call from ' + data.cid + ': show data>'))
          $('iframe').attr('src', 'new_page.php');
      }
    });
  };
  setInterval(ping, 3000);
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...