任何方法都可以“Echo, Display, print”循环中间的一条消息


PHP Any way to "Echo , Display, Print" a message in the middle of a loop?

我需要强制我的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()"函数来重新加载页面,但我不想重新加载页面本身(将在父页面内创建一个复杂的)

有什么建议吗?

在flush函数的手册页中有几件事需要检查:

flush()可能无法覆盖您的web服务器的缓冲方案,它对浏览器中的任何客户端缓冲都没有影响


一些服务器,特别是在Win32上,仍然会缓冲脚本的输出,直到它在将结果传输到浏览器之前终止。


Apache的服务器模块,如mod_gzip,可能会做自己的缓冲,这将导致flush()不会立即将数据发送到客户端。

还有一些需要检查的配置文件选项在注释

中提到

如果flush()函数不工作。你必须在php.ini中设置如下选项:

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

我还注意到有注释掉的行导致页面刷新—您不需要刷新页面来查看新的输出,浏览器应该显示页面仍在加载,直到脚本完成。

如前所述,除非您完全控制服务器,否则这是不可能实现的,即使您这样做了,如果您想保持连接打开相当长的时间,它可能会超时,需要客户端延续。

因此,使用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>

把这个放到你的htaccess (turns of gzip):

SetEnv no-gzip dont-vary

和回显消息并刷新输出缓冲区,在循环中执行以下操作:

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