不是不行,而是你没有注意到:个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
以上方法均不行flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 ===================================== 加上ob_flush后不行个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。 ======================================== 我在本地安装vBulletin时,他在创建数据库时有这种效果的,他会不断地显示"某某某数据库已被创建",因此不存在web服务器和浏览器的问题。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 ========================================================= 我把每多输出一些字符还是不行。 for($i=0;$i<5;$i++){ echo $i ."个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。<br>"; ob_flush(); flush(); sleep(1); }
vBulletin安装时的这种效果是在每次输出一段字符后,调用一个vbflush函数,我把这个函数铐到我的测试文件里测试,但确不管用。 这个函数是样的 function vbflush() { static $output_handler = null; if ($output_handler === null) { $output_handler = @ini_get('output_handler'); } if ($output_handler == 'ob_gzhandler') { // forcing a flush with this is very bad return; } flush(); if (PHP_VERSION >= '4.2.0' AND function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) { @ob_flush(); } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) { @ob_end_flush(); @ob_start(); } }
for($i=0;$i<5;$i++){
echo $i ."<br>";
ob_flush();
flush();
sleep(1);
}
?>
=====================================
加上ob_flush后不行个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
========================================
我在本地安装vBulletin时,他在创建数据库时有这种效果的,他会不断地显示"某某某数据库已被创建",因此不存在web服务器和浏览器的问题。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
=========================================================
我把每多输出一些字符还是不行。
for($i=0;$i<5;$i++){
echo $i ."个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。<br>";
ob_flush();
flush();
sleep(1);
}
这个函数是样的
function vbflush()
{
static $output_handler = null;
if ($output_handler === null)
{
$output_handler = @ini_get('output_handler');
} if ($output_handler == 'ob_gzhandler')
{
// forcing a flush with this is very bad
return;
} flush();
if (PHP_VERSION >= '4.2.0' AND function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false)
{
@ob_flush();
}
else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE)
{
@ob_end_flush();
@ob_start();
}
}
2.不要使用win32下的服务比如IIS
3.确保apahce加载mod_gzip这类会缓存结果的模块
4.不要将输出内容放在表格这样的标签内
5.事先输出256个以上的字节才开始输出正式数据
不错,确定都做到了,我分别用公司的linux-apache和本地的win-apache下都试了,没有加mod_gzip,事先输出一些字符。
真是奇怪呃
===========================
<?
for($i=0;$i<5;$i++){
echo $i ."<br/>";
echo str_pad('',4096)."<br />\n";
flush ();
sleep(1);
}
?>
===========================
0<br/>1<br/>2<br/>3<br/>4<br/>
Output completed (5 sec consumed) - Normal Termination