首頁  >  文章  >  後端開發  >  PHP逐行輸出資料並解決兩種常見緩衝問題

PHP逐行輸出資料並解決兩種常見緩衝問題

WBOY
WBOY原創
2016-08-08 09:30:30818瀏覽

部落客熱衷各種網路科技,常囉嗦,時常伴隨強迫症,常更新,覺得文章對你有幫助的可以關注我。 轉載請註明"深藍的鐮刀"


1.遇到問題

不知你們有沒有碰到過這樣兩種情況:所有的數據在瀏覽器中展示出來,因為需要對比數據,老闆要求是

不能使用分頁
    ,那麼好了,輸出個1000條數據直接循環打印出來沒問題,但是數據如果是幾百萬條呢?瀏覽器直接卡死,等你離開座位出去喝了杯咖啡,上了個廁所,和前台mm聊了個天,回來發現瀏覽器已經「程式未回應」了,你該怎麼辦?
  1. 老闆讓你改進一下網站的下載鏈接,要求直接鼠標左擊就下載文件(某些文件類型,直接左擊會打開這個文件,很多網站會提示你“右鍵另存為”),你用了header函數和readfile
  2. 函數輕鬆實現了這個功能,但是上線後發現如果文件過大瀏覽器依舊會卡死,這次老闆要請你喝咖啡了,你該怎麼辦?
  3. 好吧,如果你碰到了以上兩種情況,或者你將來可能會面臨這樣的問題,你可以mark一下,以便下次快速解決。
2.原理

言歸正傳。

下面隆重推出PHP輸出控制之

輸出緩衝區

功能吧,

是不是很牛X的感覺。

原理的話就是PHP在輸出資料前先將資料放進

緩衝(Buffer)裡,等待需要時我們再將緩衝的資料輸出出來,注意一下這裡不要跟快取(Cache)

混淆。


這樣做的好處一方面可以實現類似延遲載入的酷炫效果,一方面也能夠降低伺服器和客戶端的壓力,不然輸出大數據時就會出現記憶體不夠用的情況。

註:ob_flush()flush()在用途上都是刷出緩衝區數據,但是官方建議,因為雖然在大部分WebServer下只用

就能刷出緩衝,但是在某些情況下如apache中有時需要調用

flush()才行,所以為了你代碼的可移植性,

建議看到

ob_flush()立馬在後面加上flush()。 既然知道原理,我們來解決開頭提到的兩個問題了。 3.解決百萬數據單頁輸出卡死的問題

<?php
if (ob_get_level() == 0){ ob_start() }else{ exit(0);};//开始缓冲

for ($i = 0; $i<10; $i++){
    echo "Line to show.\n<br />";//不直接输出,先存入缓冲区中
    ob_flush();//将缓冲区的数据输出出来
    flush();//将缓冲区的数据输出出来
    sleep(2);//暂停两秒
}

echo "Done.";

ob_end_flush();//关闭并清理缓冲区
4.解決header實作檔案下載時檔案過大導致卡死的問題

4.解決header實作檔案下載時檔案過大導致卡死的問題

以上就介紹了PHP逐行輸出資料並解決兩種常見緩衝問題,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn