在PHP開發的過程中有時候會有資料需要匯出,可以利用各種框架中的一些套件來直接取得資料然後丟入對應的處理方法就行了,但是當遇到大量的資料需要匯出的時候,我們就需要用其他的方法來實現了。
一般處理大數據有以下幾種解決方法: 透過新增或修改事件觸發腳本,產生資料;定時任務執行腳本產生資料;直接使用phpexcel匯出大量資料;採用fputcsv即時資料流方式寫入。用一張圖表示如下:
這裡主要記錄下使用fputcsv方式匯出資料。
public function exportData() { set_time_limit(0); ini_set('memory_limit', '1024M'); $columns = [ '列名1', '列名2', '列名3' //需要几列,定义好列名 ]; //设置好告诉浏览器要下载excel文件的headers header('Content-Description: File Transfer'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename="导出数据-'.date('Y-m-d', time()).'.csv"'); 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流中 //添加查询条件,获取需要的数据 $query = Model::class()->where(); //获取总数,分页循环处理 $accessNum = $query->count(); $perSize = 1000; $pages = ceil($accessNum / $perSize); for($i = 1; $i <= $pages; $i++) { $db_data = $query->limit($perSize)->offset(($i-1)*$perSize)->get(); foreach($db_data as $key => $value) { $rowData = []; //获取每列数据,转换处理成需要导出的数据 //需要格式转换,否则会乱码 mb_convert_variables('GBK', 'UTF-8', $rowData); fputcsv($fp, $rowData); } //释放变量的内存 unset($db_data); //刷新输出缓冲到浏览器 ob_flush(); //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 flush(); } fclose($fp); exit(); }
這樣會一邊生成,一邊寫入下載文件,提高處理速度。
之前使用的套件處理,產生一個25M的數據,要20分鐘。這種方式處理需要1分多鐘(也和實際處理的環境有關)。
相關推薦:
以上是php中導出大量資料的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!