欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

循環查詢mysql,實時生成并下載大數據量的EXCEL文件

錢衛國2年前21瀏覽0評論
循環查詢mysql,實時生成并下載大數據量的EXCEL文件?

對于任何一個網站肯定是少不了下載功能,常見的下載功能有圖片、視頻、Excel表格,如果文件比較小的話,那么不會遇到任何的問題,但是當文件信息而超過了PHP的最大內存,那么在這個時候它就會有的內存溢出的問題。

那么它們是因為什么而發生的?對于這個過程的原理才是我們應該真正要去弄明白的事情

下載大數據量的EXCEL文件為何要報錯?

PHP在下載大Excel表格的時候,那么首先它是需要去把MySQL的數據從硬盤上面讀取到內存,但讀取它是一次性載入到我們的內存,如果說它一次性載入的數據量遠遠大于最大內存,然后再來執行瀏覽器的業務下載。那么這個時候它就會發生我們這個內存溢出。

就比如:說我們現在有100M的數據量,但是我們PHP內存最大只有64M,那么這個它肯定是裝不了的,我們可以把那個內存比喻為一個水杯,這個水杯的容量比喻為內存,現在杯子最大容量為64L。你要存放100L。肯定放不下

大事化小,小事化了。拆分成段

從上面可以看到文件下載,它是分為兩步,首先是載入內存然后執行瀏覽器的輸出下載,那么既然大型文件一次性載入不了,那可以采用 “大事化小,小事化了”思路,我們可以實現邊寫邊下載,也就是分批次的讀取與寫入。

因為用戶的話,只要最終拿到這個文件就可以,對于瀏覽器的下載原理不需要關心。只需要給到文件下載提示給用戶即可,然后后端在實時的分批次的寫入到要下載的文件當中。

實現思路步驟:

1、一設置瀏覽器下載Excel需要的Header

2、打開 php://output 流,并設置寫入文件句柄。

注:(php://output,是一個可寫的輸出流,允許程序像操作文件一樣將輸出寫入到輸出流中,PHP會把輸出流中的內容發送給web服務器并返回給發起請求的瀏覽器)

3、獲取數據庫所有數據量,并設置每次查詢的條數,通過這兩個值計算分批查詢的次數

4、基于分批查詢的次數循環查詢數據庫,然后寫入到文件中,同時清除本次操作變量內存,刷新緩沖到瀏覽器,讓瀏覽器的文件始終實時保持到最新的大小

注:刷新用ob_flush、flush()PHP的I/O流

在這里我們用到了PHP的一個IO的輸入輸出,也就是我們常用的

php://input php://output。

php://input

php://input可以讀取原始的POST數據。相較于$HTTP_RAW_POST_DATA而言,它給內存帶來的壓力較小,并且不需要特殊的php.ini設置。php://input不能用于enctype=multipart/form-data”.

注:HTTP_RAW_POST_DATA 在PHP7已經被廢棄,它不是$_POST額

php://output

php://output 是一個只寫的數據流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩沖區。

綜上:實現思維與原理很重要如有感悟,歡迎關注額。(* ̄︶ ̄)