PHP中我們了解了那麼多關於PHP的知識,不知道你們對運用PHP的技能掌握多少,我相信很大一部分人會了解但是不會運用知識,那麼不急本篇文章就是帶領大家更深刻的去運用PHP。
分析
首先明確我們需要匯出的數量50W ,其次我們使用過都知道Excel2003版最大行數是65535行,Excel2007版的行數(1048576行)才能達到我們的要求,所以我們需要使用Excel的版本必須為2007版及以上。
目前最常用的PHP處理Excel的類別庫是PHPExcel(經過實例測試匯出1w條數據,再加上各種數據判斷處理我用了5-8分鐘);我在網上還查到一款叫PHPOffice(這個我沒用過,大家可以嘗試一下,據說效率比PHPExcel要好,等下次再寫篇博文介紹一下);還有一個fputcsv(),匯出的是csv格式文件,也可以用Excel文件開啟。
這個是直接的,請求逾時。在這個多的資料請求處理下,超市非常常見,這時我們需要修改PHP的配置:set_time_limit(0)。
我們一次性的把所有資料從資料庫取出填入記憶體中,一下不光記憶體儲存不夠,如果伺服器CPU配置不高的話使用率一下也能達到100%,會造成伺服器卡負載。關於溢出我們也需要修改PHP的配置:ini_set('memory_limit', '1024M')。
使用此種方案匯出50w 的資料體驗非常的不好,經測試之後是雖說是可行的,伺服器上也可以匯出,就是時間會慢一些,而且會是一直下載狀態。如果使用php類別庫,建議將php升級到最新的php7版本節省內存,且計算速度要快
如果不是用php類別庫,那麼fputcsv()是最佳方式,這種方式要比PHPExcel好很多;因為csv檔案較小,csv檔案資料可存放數量可大可小,csv產生不佔用大量CPU和時間,而Excel的生成時間隨著文件資料量的增加成而所需時間越多。
將資料依照某種條件分割,減少匯出的資料量,例如依照日期匯出,可一週匯出一次或一天匯出一次,資料分割肯定是必須的步驟,防止記憶體溢出,運行超時;
進行演算法優化,在資料循環時,減少嵌套循環,生成csv或Excel的資料物件時,一次成型,減少資料庫查詢次數,如果需要用到其他資料請事先產生對應資料結構的資料。
將需求交給運維,直接執行sql語句進行匯出:
SELECT * FROM table_name INTO OUTFILE 'F:/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
執行此語句可能會出現如下錯誤:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
這個是由於Mysql的配置權限問題,可以運行SHOW VARIABLES LIKE '%secure%';查看secure-file-priv 目前的值是什麼,NULL就代表禁止導出,所以需要設置一下。在Mysql安裝路徑下的my.ini文件,修改設定一下路徑,沒有的話添加上此配置:
secure_file_priv=F:/
50w 的資料你會發現很快就導出了。你也可以寫此語句,知道此文件在伺服器上的路徑,進行打包下載即可。
相關學習影片分享:php影片教學
#以上是一分鐘解PHP大資料量(大於50萬)匯出到Excel的詳細內容。更多資訊請關注PHP中文網其他相關文章!