|
PHP有很多機(jī)制、函數(shù),其實(shí)就是魔術(shù)師,重復(fù)發(fā)揮好,其實(shí)甚至是簡單應(yīng)用,就會出現(xiàn)神奇的效果。這里講一個(gè)ob_start()函數(shù)。 ob_start()函數(shù)用于打開緩沖區(qū),比如header()函數(shù)之前如果就有輸出,包括回車空格換行都會有”Header had all ready send by”的錯誤,這時(shí)可以先用ob_start()打開緩沖區(qū)PHP代碼的數(shù)據(jù)塊和echo()輸出都會進(jìn)入緩沖區(qū)而不會立刻輸出.當(dāng)然打開緩沖區(qū)的作用很多,只要發(fā)揮你的想象.可以總結(jié)以下四點(diǎn): 1.用于header()之前 ob_start(); //打開緩沖區(qū) echo ”Hellon”; //輸出 header(”location:index.php”); //把瀏覽器重定向到index.php ob_end_flush();//輸出全部內(nèi)容到瀏覽器 ?> 2.phpinfo()函數(shù)可獲取客戶端和服務(wù)器端的信息,但要保存客戶端信息用緩沖區(qū)的方法是最好的選擇. ob_start(); //打開緩沖區(qū) phpinfo(); //使用phpinfo函數(shù) $info=ob_get_contents(); //得到緩沖區(qū)的內(nèi)容并且賦值給$info $file=fopen(’info.txt’,’w’); //打開文件info.txt fwrite($file,$info); //寫入信息到info.txt fclose($file); //關(guān)閉文件info.txt ?> 3.靜態(tài)頁面技術(shù) ob_start();//打開緩沖區(qū) ?> php頁面的全部輸出 $content = ob_get_contents();//取得php頁面輸出的全部內(nèi)容 $fp = fopen(”output00001.html”, “w”); //創(chuàng)建一個(gè)文件,并打開,準(zhǔn)備寫入 fwrite($fp, $content); //把php頁面的內(nèi)容全部寫入output00001.html,然后…… fclose($fp); ?> 4.輸出代碼 Function run_code($code) { If($code) { ob_start(); eval($code); $contents = ob_get_contents(); ob_end_clean(); }else { echo “錯誤!沒有輸出”; exit(); } return $contents; } Output Control 函數(shù)可以讓你自由控制腳本中數(shù)據(jù)的輸出。它非常地有用,特別是對于:當(dāng)你想在數(shù)據(jù)已經(jīng)輸出后,再輸出文件頭的情況。輸出控制函數(shù)不對使用 header() 或 setcookie(), 發(fā)送的文件頭信息產(chǎn)生影響,只對那些類似于 echo() 和 PHP 代碼的數(shù)據(jù)塊有作用。 我們先舉一個(gè)簡單的例子,讓大家對Output Control有一個(gè)大致的印象: Example 1. CODE<?php ob_start(); //打開緩沖區(qū) echo ”Hellon”; //輸出 header(”location:index.php”); //把瀏覽器重定向到index.php ob_end_flush();//輸出全部內(nèi)容到瀏覽器 ?> 所有對header()函數(shù)有了解的人都知道,這個(gè)函數(shù)會發(fā)送一段文件頭給瀏覽器,但是如果在使用這個(gè)函數(shù)之前已經(jīng)有了任何輸出(包括空輸出,比如空格,回車和換行)就會提示出錯。如果我們?nèi)サ舻谝恍械膐b_start(),再執(zhí)行此程序,我們會發(fā)現(xiàn)得到了一條錯誤提示:”Header had all ready send by”!但是加上ob_start,就不會提示出錯,原因是當(dāng)打開了緩沖區(qū),echo后面的字符不會輸出到瀏覽器,而是保留在服務(wù)器,直到你使用 flush或者ob_end_flush才會輸出,所以并不會有任何文件頭輸出的錯誤! 一、相關(guān)函數(shù)簡介: 1、Flush:刷新緩沖區(qū)的內(nèi)容,輸出。 函數(shù)格式:flush() 說明:這個(gè)函數(shù)經(jīng)常使用,效率很高。 2、ob_start :打開輸出緩沖區(qū) 函數(shù)格式:voidob_start(void) 說明:當(dāng)緩沖區(qū)激活時(shí),所有來自PHP程序的非文件頭信息均不會發(fā)送,而是保存在內(nèi)部緩沖區(qū)。為了輸出緩沖區(qū)的內(nèi)容,可以使用ob_end_flush()或flush()輸出緩沖區(qū)的內(nèi)容。 3 、ob_get_contents :返回內(nèi)部緩沖區(qū)的內(nèi)容。 使用方法:stringob_get_contents(void) 說明:這個(gè)函數(shù)會返回當(dāng)前緩沖區(qū)中的內(nèi)容,如果輸出緩沖區(qū)沒有激活,則返回 FALSE 。 4、ob_get_length:返回內(nèi)部緩沖區(qū)的長度。 使用方法:intob_get_length(void) 說明:這個(gè)函數(shù)會返回當(dāng)前緩沖區(qū)中的長度;和ob_get_contents一樣,如果輸出緩沖區(qū)沒有激活。則返回 FALSE。 5、ob_end_flush :發(fā)送內(nèi)部緩沖區(qū)的內(nèi)容到瀏覽器,并且關(guān)閉輸出緩沖區(qū)。 使用方法:voidob_end_flush(void) 說明:這個(gè)函數(shù)發(fā)送輸出緩沖區(qū)的內(nèi)容(如果有的話)。 6、ob_end_clean:刪除內(nèi)部緩沖區(qū)的內(nèi)容,并且關(guān)閉內(nèi)部緩沖區(qū) 使用方法:voidob_end_clean(void) 說明:這個(gè)函數(shù)不會輸出內(nèi)部緩沖區(qū)的內(nèi)容而是把它刪除! 7、ob_implicit_flush:打開或關(guān)閉絕對刷新 使用方法:voidob_implicit_flush ([int flag]) 說明:使用過Perl的人都知道$|=x的意義,這個(gè)字符串可以打開/關(guān)閉緩沖區(qū),而ob_implicit_flush 函數(shù)也和那個(gè)一樣,默認(rèn)為關(guān)閉緩沖區(qū),打開絕對輸出后,每個(gè)腳本輸出都直接發(fā)送到瀏覽器,不再需要調(diào)用 flush() 二、深入了解: 1. 關(guān)于Flush函數(shù): 這個(gè)函數(shù)在PHP3中就出現(xiàn)了,是一個(gè)效率很高的函數(shù),他有一個(gè)非常有用的功能就是刷新browser的cache.我們舉一個(gè)運(yùn)行效果非常明顯的例子來說明flush. Example 2. CODE<?php for($i = 1; $i<= 300; $i++ ) print(” “); // 這一句話非常關(guān)鍵,cache的結(jié)構(gòu)使得它的內(nèi)容只有達(dá)到一定的大小才能從瀏覽器里輸出 // 換言之,如果cache的內(nèi)容不達(dá)到一定的大小,它是不會在程序執(zhí)行完畢前輸出的。經(jīng) // 過測試,我發(fā)現(xiàn)這個(gè)大小的底限是256個(gè)字符長。這意味著cache以后接收的內(nèi)容都會 // 源源不斷的被發(fā)送出去。 For($j = 1; $j <= 20; $j++) { echo $j.”“; flush(); //這一部會使cache新增的內(nèi)容被擠出去,顯示到瀏覽器上 sleep(1); //讓程序”睡”一秒鐘,會讓你把效果看得更清楚 } ?> 具體效果你可以到這里看看[url]~uchinaboy/out.php[/url] PHP2000的最新的PHP聊天室就是用的這個(gè)技術(shù),可惜的是源代碼未公開 L 注:如果在程序的首部加入ob_implicit_flush()打開絕對刷新,就可以在程序中不再使用flush(),這樣做的好處是:提高效率! 2. 關(guān)于ob系列函數(shù): 我想先引用我的好朋友y10k的一個(gè)例子: Example 3. 比如你用得到服務(wù)器和客戶端的設(shè)置信息,但是這個(gè)信息會因?yàn)榭蛻舳说牟煌煌?如果想要保存phpinfo()函數(shù)的輸出怎么辦呢?在沒有緩沖區(qū)控制之前,可以說一點(diǎn)辦法也沒有,但是有了緩沖區(qū)的控制,我們可以輕松的解決: CODE<?php ob_start(); //打開緩沖區(qū) phpinfo(); //使用phpinfo函數(shù) $info=ob_get_contents(); //得到緩沖區(qū)的內(nèi)容并且賦值給$info $file=fopen(’info.txt’,’w’); //打開文件info.txt fwrite($file,$info); //寫入信息到info.txt fclose($file); //關(guān)閉文件info.txt ?> 用以上的方法,就可以把不同用戶的phpinfo信息保存下來,這在以前恐怕沒有辦法辦到!其實(shí)上面就是將一些”過程”轉(zhuǎn)化為”函數(shù)”的方法! 或許有人會問:”難道就這個(gè)樣子嗎?還有沒有其他用途?”當(dāng)然有了,比如筆者論壇的PHP 語法加亮顯示就和這個(gè)有關(guān)(PHP默認(rèn)的語法加亮顯示函數(shù)會直接輸出,不能保存結(jié)果,如果在每次調(diào)用都顯示恐
信息發(fā)布:廣州名易軟件有限公司 http://www.jetlc.com
|