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

來源:互聯網
上載者:User
博主熱衷各種互連網技術,常囉嗦,時常伴有強迫症,常更新,覺得文章對你有協助的可以關注我。 轉載請註明"深藍的鐮刀"

1.遇到問題

不知你們有沒有碰到過這樣兩種情況:

  1. 老闆要你將資料庫中所有的資料在瀏覽器中展示出來,因為需要對比資料,老闆要求是不能使用分頁,那麼好了,輸出個1000條資料直接迴圈列印出來沒問題,但是資料如果是幾百萬條呢?瀏覽器直接卡死,等你離開座位出去喝了杯咖啡,上了個廁所,和前台mm聊了個天,回來發現瀏覽器已經“程式未響應”了,你該怎麼辦?
  2. 老闆讓你改進一下網站的下載連結,要求直接滑鼠左擊就下載檔案(某些檔案類型,直接左擊會開啟這個檔案,很多網站會提示你“右鍵另存新檔”),你用了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教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.