所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:“header had all ready send by”!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
具体效果你可以到这里看看http://www.php2000.com/~uchinaboy/out.php php2000的最新的php聊天室就是用的这个技术,可惜的是源代码未公开 l 注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是:提高效率!
<? /* ** title.........: php4 http compression speeds up the web ** version.......: 1.20 ** author........: catoc <[email protected]> ** filename......: gzdoc.php ** last changed..: 18/10/2000 ** requirments...: php4 >= 4.0.1 ** php was configured with --with-zlib[=dir] ** notes.........: dynamic content acceleration compresses ** the data transmission data on the fly ** code by sun jin hu (catoc) <[email protected]> ** most newer browsers since 1998/1999 have ** been equipped to support the http 1.1 ** standard known as "content-encoding." ** essentially the browser indicates to the ** server that it can accept "content encoding" ** and if the server is capable it will then ** compress the data and transmit it. the ** browser decompresses it and then renders ** the page. ** ** modified by john lim ([email protected]) ** based on ideas by sandy mcarthur, jr ** usage........: ** no space before the beginning of the first '<?' tag. ** ------------start of file---------- ** |<? ** | include('gzdoc.php'); ** |? > ** |<html> ** |... the page ... ** |</html> ** |<? ** | gzdocout(); ** |? > ** -------------end of file----------- */ ob_start(); ob_implicit_flush(0); function checkcangzip(){ global $http_accept_encoding; if (headers_sent() || connection_timeout() || connection_aborted()){ return 0; } if (strpos($http_accept_encoding, 'x-gzip') !== false) return "x-gzip"; if (strpos($http_accept_encoding,'gzip') !== false) return "gzip"; return 0; } /* $level = compression level 0-9, 0=none, 9=max */ function gzdocout($level=1,$debug=0){ $encoding = checkcangzip(); if ($encoding){ print "n<!-- use compress $encoding -->n"; $contents = ob_get_contents(); ob_end_clean(); if ($debug){ $s = "<p>not compress length: ".strlen($contents); $s .= " compressed length: ".strlen(gzcompress($contents,$level)); $contents .= $s; } header("content-encoding: $encoding"); print "x1fx8bx08x00x00x00x00x00"; $size = strlen($contents); $crc = crc32($contents); $contents = gzcompress($contents,$level); $contents = substr($contents, 0, strlen($contents) - 4); print $contents; print pack('v',$crc); print pack('v',$size); exit; }else{ ob_end_flush(); exit; } } ?>