1. 程式人生 > >有關檔案操作的函式+緩衝

有關檔案操作的函式+緩衝

應用:
1 header/setcookies設定時會warning,開啟緩衝
2 將頁面部分/全部靜態化,提高瀏覽的處理的速度

ob_start();
//。。。。輸出
$string = ob_get_contents();
file_put_contents('a.html', $string);
ob_flush();
flush();

3 下載大檔案,避免php對大檔案大小的限制,迴圈讀一部分然後輸出;
用PHP寫檔案下載頁面.其原理很簡單,就是通過fread把檔案內容讀出並顯示,然後通過header來發送HTTP頭,讓瀏覽器知道這是一個附件,這樣就可以達到提供下載的效果.


如果用上面的辦法提供下載頁面,會碰到一個效率問題,如果一個檔案很大,假設為100M,那麼在不開啟緩衝區輸出的情況下,必須要把100M資料全部讀出,然後一次返回到頁面上,如果這樣做,使用者將會在所有資料讀完之後才會得到響應,降低了使用者體驗感.
另外,該做法還解決了另外一個很嚴重的問題.例如一個檔案是100M,如果不開啟緩衝區的情況下,則需要把100M檔案全部讀入記憶體,然後再輸出.但是,如果PHP程式做了記憶體限制呢?需要用到上面的辦法來解決這個問題,每次只讀某一段,這樣就可以避免了記憶體的限制

常用函式:
ob_start()
ob_get_contents()
void ob_flush ( void )
此函式在前面的例子經常用到了,其作用就是 “送出” 當前緩衝區內容,同時清空緩衝區,需要注意這裡用的是 “送出” 一詞,也就是說呼叫此函式並不會將緩衝區內容輸出,從 例3 可以看出必須在其後呼叫 flush 函式其才會輸出。這個是沖刷php自身的緩衝,經資料送向伺服器的緩衝。
void flush ( void )
用來將其前面的所有輸出傳送到瀏覽器顯示,且不會對快取區有任何影響。將不再緩衝區的或者釋放出來的資料輸出到瀏覽器,當開啟輸出緩衝後,ob_flush和flush要配合使用。不論是 echo 等函式的輸出,還是 HTML實體 ,或是執行 ob_start() 送出的內容,執行 flush() 後都會在瀏覽器進行顯示。