1. 程式人生 > 遊戲 >有傳言稱《女神異聞錄3:攜帶版》重製版正在開發中

有傳言稱《女神異聞錄3:攜帶版》重製版正在開發中

前言: 很多時候,因為資料統計,我們需要將資料庫的資料匯出到Excel等檔案中,以供資料人員進行檢視,如果資料集不大,其實很容易;但是如果對於大數集的匯出,將要考慮各種效能的問題,這裡以匯出資料庫一百萬條資料為例,匯出時間不過20秒,值的學習的一種大資料匯出方式。

一、匯出思路

  • 需要考慮伺服器記憶體
  • 需要考慮程式執行的最大時間
  • 缺少BOM頭導致亂碼的處理
  • 如果匯出數量過大,推薦使用迴圈匯出,每次迴圈這裡以匯出一萬條為例,迴圈100次即可全部匯出

二、匯出原始碼

  • 下面原始碼將資料庫資訊修改成自己的即可使用
  • 親測匯出一百萬條資料,3個欄位,不過20秒
  • 如果伺服器硬體不支援一次讀取一萬條資料,可將迴圈次數提高,匯出數量降低
  • <?php
      //讓程式一直執行
      set_time_limit(0);
      //設定程式執行記憶體
      ini_set('memory_limit', '128M');
     
      $fileName = '測試匯出資料';
      header('Content-Encoding: UTF-8');
      header("Content-type:application/vnd.ms-excel;charset=UTF-8");
      header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
      
      //開啟php標準輸出流
      $fp = fopen('php://output', 'a');
     
      //新增BOM頭,以UTF8編碼匯出CSV檔案,如果檔案頭未新增BOM頭,開啟會出現亂碼。
      fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
      //新增匯出標題
      fputcsv($fp, ['姓名', '年齡', '地區']);
      
      //連結資料庫
      $dsn = "mysql:host=127.0.0.1;port=3306;dbname=db_www;charset=utf8";
      $pdo = new PDO($dsn, 'root', '');
     
      $step = 100; //迴圈次數
      $nums = 10000; //每次匯出數量
     
      for($i = 0; $i < $step; $i++) {
        $start = $i * 10000;
        $sql = "SELECT uname,age,city FROM `hd_test` ORDER BY `id` LIMIT {$start},{$nums}";
        $pdostatement = $pdo->query($sql);
        $result = $pdostatement->fetchAll(PDO::FETCH_ASSOC);
        foreach ($result as $item) {
          fputcsv($fp, $item);
        }
        //每1萬條資料就重新整理緩衝區
        ob_flush();
        flush();
      } 
    

      

    三、快速生成百萬條測試資料

    這裡推薦資料庫的蠕蟲複製命令
    先建好表後,插2條測試資料後,執行幾次下列命令,即可指數增長

  • INSERT INTO hd_test (uname,age,city) SELECT uname,age,city FROM hd_test;