博主熱衷各種互連網技術,常囉嗦,時常伴有強迫症,常更新,覺得文章對你有協助的可以關注我。 轉載請註明"深藍的鐮刀"
1.遇到問題
不知你們有沒有碰到過這樣兩種情況:
- 老闆要你將資料庫中所有的資料在瀏覽器中展示出來,因為需要對比資料,老闆要求是不能使用分頁,那麼好了,輸出個1000條資料直接迴圈列印出來沒問題,但是資料如果是幾百萬條呢?瀏覽器直接卡死,等你離開座位出去喝了杯咖啡,上了個廁所,和前台mm聊了個天,回來發現瀏覽器已經“程式未響應”了,你該怎麼辦?
- 老闆讓你改進一下網站的下載連結,要求直接滑鼠左擊就下載檔案(某些檔案類型,直接左擊會開啟這個檔案,很多網站會提示你“右鍵另存新檔”),你用了header函數和readfile函數輕鬆實現了這個功能,但是上線後發現如果檔案過大瀏覽器依舊會卡死,這次老闆要請你喝咖啡了,你該怎麼辦?
好吧,如果你碰到了以上兩種情況,或者你將來可能會面臨這樣的問題,你可以mark一下,以便下次快速解決。
2.原理
言歸正傳。
下面隆重推出PHP輸出控制之輸出緩衝區
首先,試一下下面代碼的效果
";//不直接輸出,先存入緩衝區中 ob_flush();//將緩衝區的資料輸出出來 flush();//將緩衝區的資料輸出出來 sleep(2);//暫停兩秒}echo "Done.";ob_end_flush();//關閉並清理緩衝區
想不到PHP也能實現這種消極式載入的功能吧,是不是很牛X的感覺。
原理的話就是PHP在輸出資料前先將資料放進緩衝(Buffer)裡,等待需要時我們再將緩衝的資料輸出出來,注意一下這裡不要跟緩衝(Cache)混淆。
這樣做的好處一方面可以實作類別似消極式載入的炫酷效果,一方面也能夠降低伺服器和用戶端的壓力,不然輸出大資料時就會出現記憶體不夠用的情況。
註:ob_flush()和flush()在用途上都是刷出緩衝區資料,但是官方建議配套使用,因為雖然在大部分WebServer下只用ob_flush()就能刷出緩衝,但是在某些情況下如apache中有時需要調用flush()才行,所以為了你代碼的可移植性,建議看到ob_flush()立馬在後面加上flush()。
既然知道了原理,我們來解決開頭提到的兩個問題。
3.解決百萬資料單頁面輸出卡死的問題
4.解決header實現檔案下載時檔案過大導致卡死的問題
以上就介紹了PHP逐行輸出資料並解決兩種常見緩衝問題,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。