![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5yYzcTYzEWO5EWNjFmZ5ATZmZzM0M2MzkTZlZGZiFDZj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
文章來自:https://www.jianshu.com/p/e762088f2fa1
作者:phper
點選加入:PHP自學中心技術交流微信群
商務合作: 請加微信(QQ):2230304070
技術交流微信群
pb 如何導出csv_百萬級資料導出的各種坑,你遇到哪些?一、PHP設定的坑二、exce的l坑三、csv坑四、總結做法
視訊教程分享
更多視訊教程請檢視碼農網IT技術教程
1 2020版-Swoole從入門到精通全套進階實戰
連結:http://www.mano100.cn/thread-1640-1-1.html
2 2020版Node.JS入門到大神
連結:http://www.mano100.cn/thread-1641-1-1.html
3 TypeScript系統入門到項目實戰
連結:http://www.mano100.cn/thread-1642-1-1.html
4 Node.js仿知乎服務端-深入了解RESTful API
連結:http://www.mano100.cn/thread-1644-1-1.html
5 Swoole實作IM即時通訊(QQ、微信通信)
連結:http://www.mano100.cn/thread-1643-1-1.html
精選文章正文
既然是導出資料,大夥們當然馬上想到了excel格式了,多友善檢視資料呀,然而用excel是有各種坑的。
目前PHP處理Excel的類庫
我一直都在用PHPExcel ,不過現在官方不再維護了,是以新PHPer,建議還是要用PHPOffice/PhpSpreadsheet,看過文檔的,其實都差不多。
一、PHP設定的坑
set_time_limit – 設定腳本最大執行時間:
此配置一般PHP預設是30秒,如果你是資料小的,可能就不會發現有該設定問題,但如果你資料達到了百萬級導出,往往30秒是不夠的,是以你需要在你的腳本中添加 set_time_limit(0),讓該腳本沒有執行時間現在
memory_limit – PHP的記憶體限定:
此配置一般php預設是128M,如果之前做過小資料的朋友可能也會動過這個配置就能解決許多問題,或許有人想,你大資料也把這個調大不就行了嗎?那麼真的是too young too native了,你本地能設定1G或者無限制或許真的沒問題,但是正式場,你這麼搞遲早會出事的,一個PHP程式占那麼大的記憶體的空間,如果你叫你公司運維幫忙調一下配置,估計運維一定很不情願,伺服器硬體這麼搞也是太奢侈了。是以說,我們要盡量避免調大該設定。
二、exce的l坑
表資料限制:
1、Excel 2003及以下的版本。一張表最大支援65536行資料,256列。
2、Excel 2007-2010版本。一張表最大支援1048576行,16384列。
也就是說你想幾百萬條輕輕松松一次性導入一張EXCEL表是不行的,你起碼需要進行資料分割,保證資料不能超過104W一張表。
PHPexcel記憶體溢出:
既然資料限制在104W,那麼資料分割就資料分割呗,于是你嘗試50W一次導入表,然而PHPexcel内部有函數報記憶體溢出錯誤,然後你就不斷的調小資料量,直到5W一次導入你都會發現有記憶體溢出錯誤。這是為什麼呢,雖然你分割資料來導入多個資料表,但是最後PHPexcel内部還是一次性把所有表資料放進一個變量中來建立檔案……額,這幾百萬資料一個變量存儲,你想記憶體不溢出,還真有點困難。
PHPExcel也有解決方案:PHPExcel_Settings::setCacheStorageMethod方法更改緩沖方式來減小記憶體的使用
三、csv坑
EXCEL這麼麻煩,試着用csv檔案儲存,既不限制數量,還能直接用EXCEL來檢視,又能以後把檔案導入資料庫,一舉幾得豈不是美哉?想法是好,CSV也有坑哦!
輸出buffer過多:
當你用PHP原生函數putcsv()其實就使用到了輸出緩存buffer,如果你把幾百萬的資料一直用這個函數輸出,會導緻輸出緩存太大而報錯的,是以我們每隔一定量的時候,必須進行将輸出緩存中的内容取出來,設定為等待輸出狀态。
具體操作是:
1、ob_flush();
2、flush();
具體說明介紹:PHP flush()與ob_flush()的差別詳解
EXCEL檢視CSV檔案數量限制:
大多數人看csv檔案都是直接用EXCEL打開的。額,這不就是回到EXCEL坑中了嗎?EXCEL有資料顯示限制呀,你幾百萬資料隻給你看104W而已。
四、總結做法
分析完上面那些坑,那麼我們的解決方案來了,假設資料量是幾百萬。
1、那麼我們要從資料庫中讀取要進行資料量分批讀取,以防變量記憶體溢出,
2、我們選擇資料儲存檔案格式是csv檔案,以友善導出之後的閱讀、導入資料庫等操作。
3、以防不友善excel讀取csv檔案,我們需要104W之前就得把資料分割進行多個csv檔案儲存
4、多個csv檔案輸出給使用者下載下傳是不友好的,我們還需要把多個csv檔案進行壓縮,最後提供給一個ZIP格式的壓縮包給使用者下載下傳就好。
代碼:
//導出說明:因為EXCEL單表隻能顯示104W資料,同時使用PHPEXCEL容易因為資料量太大而導緻占用記憶體過大,
五、相關視訊教程
給大家分享幾節【PHPExcel+PHP開發架構TP5實作百萬級報表資料導入】的課程,做做筆記,學習一下!
目錄如下:
1 課程知識點介紹、MVC原理01
2 單一入口檔案講解02
3 PHPExcel原理03
4 控制器及擷取表單04
5 資料處理05
6 周遊資料06
7 百萬級資料導入方案07
8 mysql性能優化方案08
9 性能優化方向09
詳情可檢視
連結:http://www.mano100.cn/thread-1645-1-1.html
擷取教程
本公衆号裡回複:425537
以上是本文的全部内容,希望對大家的學習有幫助,也希望大家多多支援 php自學中心 ,學習與交流少不了一個圈子,點選加技術群:PHP自學中心交流②群