久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP實現實時生成并下載超大數據量的EXCEL文件詳解

EXCEL文件的處理是我們在日常工作中經常會遇到的,這篇文章主要給大家介紹了關于利用PHP如何實現實時生成并下載超大數據量的EXCEL文件,通過文中介紹的這個方法對大家的學習或者工作

前言

最近在工作中接到一個需求,通過選擇的時間段導出對應的用戶訪問日志到excel中, 由于用戶量較大,經常會有導出50萬加數據的情況。而常用的PHPexcel包需要把所有數據拿到后才能生成excel, 在面對生成超大數據量的excel文件時這顯然是會造成內存溢出的,所以考慮使用讓PHP邊寫入輸出流邊讓瀏覽器下載的形式來完成需求。

我們通過如下的方式寫入PHP輸出流

$fp = fopen('php://output', 'a');
fputs($fp, 'strings');
....
....
fclose($fp)

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

另外由于excel數據是從數據庫里逐步讀出然后寫入輸出流的所以需要將PHP的執行時間設長一點(默認30秒)set_time_limit(0)不對PHP執行時間做限制。

注:以下代碼只是闡明生成大數據量EXCEL的思路和步驟,并且在去掉項目業務代碼后程序有語法錯誤不能拿來直接運行,請根據自己的需求填充對應的業務代碼!

 /**
  * 文章訪問日志
  * 下載的日志文件通常很大, 所以先設置csv相關的Header頭, 然后打開
  * PHP output流, 漸進式的往output流中寫入數據, 寫到一定量后將系統緩沖沖刷到響應中
  * 避免緩沖溢出
  */
 public function articleAccessLog($timeStart, $timeEnd)
 {
  set_time_limit(0);
  $columns = [
   '文章ID', '文章標題', ......
  ];
  $csvFileName = '用戶日志' . $timeStart .'_'. $timeEnd . '.xlsx';
  //設置好告訴瀏覽器要下載excel文件的headers
  header('Content-Description: File Transfer');
  header('Content-Type: application/vnd.ms-excel');
  header('Content-Disposition: attachment; filename="'. $fileName .'"');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  $fp = fopen('php://output', 'a');//打開output流
  mb_convert_variables('GBK', 'UTF-8', $columns);
  fputcsv($fp, $columns);//將數據格式化為CSV格式并寫入到output流中
  $accessNum = '1000000'//從數據庫獲取總量,假設是一百萬
  $perSize = 1000;//每次查詢的條數
  $pages = ceil($accessNum / $perSize);
  $lastId = 0;
  for($i = 1; $i <= $pages; $i++) {
   $accessLog = $logService->getArticleAccessLog($timeStart, $timeEnd, $lastId, $perSize);
   foreach($accessLog as $access) {
    $rowData = [
     ......//每一行的數據
    ];
    mb_convert_variables('GBK', 'UTF-8', $rowData);
    fputcsv($fp, $rowData);
    $lastId = $access->id;
   }
   unset($accessLog);//釋放變量的內存
   //刷新輸出緩沖到瀏覽器
   ob_flush();
   flush();//必須同時使用 ob_flush() 和flush() 函數來刷新輸出緩沖。
  }
  fclose($fp);
  exit();
 }

好了, 其實很簡單,就是用逐步寫入輸出流并發送到瀏覽器讓瀏覽器去逐步下載整個文件,由于是逐步寫入的無法獲取文件的總體size所以就沒辦法通過設置header("Content-Length: $size");在下載前告訴瀏覽器這個文件有多大了。不過不影響整體的效果這里的核心問題是解決大文件的實時生成和下載。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對的支持。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 日韩av在线中文字幕 | 久久久黄色 | 午夜在线影院 | 久久九九色| 999久久久国产精品 欧美成人h版在线观看 | 综合久久综合久久 | 手机在线观看 | 粉嫩高清一区二区三区 | 免费观看一级特黄欧美大片 | 一区二区三区欧美 | 91精品国产综合久久国产大片 | 日韩国产欧美在线观看 | 精品视频在线免费观看 | 成人在线观看黄 | 国产精品国产精品国产专区不蜜 | 国产精品99久 | 伊人精品在线视频 | 伊伊综合网 | 日韩精品一区二区三区在线观看 | 欧美1区 | 欧美日韩在线视频一区二区 | 91 在线| 日韩www视频 | 中文字幕在线一区二区三区 | 九九久久这里只有精品 | 国产精品久久久亚洲 | 91天堂网| 成人免费一区二区三区视频网站 | 一级毛片,一级毛片 | 男女羞羞在线观看 | 精品久久久久久亚洲国产800 | 国产精品夜夜夜一区二区三区尤 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲精品乱码久久久久久9色 | 亚洲免费网站 | 一区精品国产欧美在线 | 麻豆精品国产91久久久久久 | 国产剧情一区 | 91精品国产91久久久久久最新 | 欧美久久久久久久 | 欧美精品一区二区免费视频 |