我需要强制我的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();