所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
具体效果你可以到这里看看[url]http://www.php2000.com/~uchinaboy/out.php[/url] PHP2000的最新的PHP聊天室就是用的这个技术,可惜的是源代码未公开 L 注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是:提高效率!
CODE<? /* ** Title.........: PHP4 HTTP Compression Speeds up the Web ** Version.......: 1.20 ** Author........: catoc <[email]catoc@163.net[/email]> ** 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]catoc@163.net[/email]> ** 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]jlim@natsoft.com.my[/email]) ** 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; } } ?>