回覆列表
  • 1 # 蓮花童子哪吒

    對於任何一個網站肯定是少不了下載功能,常見的下載功能有圖片、影片、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 一樣的方式 寫入到輸出緩衝區。

  • 2 # 使用者6255694147972

    php匯出大量資料Excel的具體操作步驟如下:

    1、使用phpstudy搭建一個測試平臺,直接訪問資料庫。

    2、下載的phpcms安裝包複製到IIS目錄,開通訪問,即可搭建成功。

    3、登入網站後臺,系統許可權,檔案目錄以及資料庫等功能,進行管理。

    4、在phpcms後臺,擴充套件,資料庫工具,資料庫匯出,程式池選擇phpcmsv9,開始備份資料。

    5、開啟IIS網站目錄,在D:\wwwroot\kmxy\wwwroot\caches\bakup\default資料夾,檢視匯出的資料庫檔案。

  • 中秋節和大豐收的關聯?
  • 羅斯這兩場出色表現不僅創造了隊史,還被球迷們稱呼最佳第六人,你們對此怎麼看?