所有對(duì)header()函數(shù)有了解的人都知道,這個(gè)函數(shù)會(huì)發(fā)送一段文件頭給瀏覽器,但是如果在使用這個(gè)函數(shù)之前已經(jīng)有了任何輸出(包括空輸出,比如空格,回車和換行)就會(huì)提示出錯(cuò)。如果我們?nèi)サ舻谝恍械膐b_start(),再執(zhí)行此程序,我們會(huì)發(fā)現(xiàn)得到了一條錯(cuò)誤提示:“header had all ready send by”!但是加上ob_start,就不會(huì)提示出錯(cuò),原因是當(dāng)打開(kāi)了緩沖區(qū),echo后面的字符不會(huì)輸出到瀏覽器,而是保留在服務(wù)器,直到你使用flush或者ob_end_flush才會(huì)輸出,所以并不會(huì)有任何文件頭輸出的錯(cuò)誤!
1. 關(guān)于flush函數(shù): 這個(gè)函數(shù)在php3中就出現(xiàn)了,是一個(gè)效率很高的函數(shù),他有一個(gè)非常有用的功能就是刷新browser的cache.我們舉一個(gè)運(yùn)行效果非常明顯的例子來(lái)說(shuō)明flush. example 2.
具體效果你可以到這里看看http://www.php2000.com/~uchinaboy/out.php php2000的最新的php聊天室就是用的這個(gè)技術(shù),可惜的是源代碼未公開(kāi) l 注:如果在程序的首部加入ob_implicit_flush()打開(kāi)絕對(duì)刷新,就可以在程序中不再使用flush(),這樣做的好處是:提高效率!
2. 關(guān)于ob系列函數(shù): 我想先引用我的好朋友y10k的一個(gè)例子: example 3.
<? /* ** 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; } } ?>