Php匯出百萬資料的優化

2021-09-07 20:32:35 字數 3643 閱讀 6810

匯出資料量很大的情況下,生成excel的記憶體需求非常龐大,伺服器吃不消,這個時候考慮生成csv來解決問題,cvs讀寫效能比excel高。

測試表student 資料(大家可以指令碼插入300多萬測資料。這裡只給個簡單的示例了)

set

names utf8mb4;

set foreign_key_checks =0;

------------------------------

--table structure for student

------------------------------

drop

table

ifexists

`student`;

create

table

`student` (

`id`

int(11) not

null

auto_increment,

`stuno`

varchar(32) character

set utf8 collate utf8_general_ci not

null

, `stuname`

varchar(10) character

set utf8 collate utf8_general_ci not

null

, `stuage`

int(11) null

default

null,

primary

key(`id`) using btree

) engine

= innodb auto_increment =

12character

set= utf8 collate = utf8_general_ci row_format =

compact;

------------------------------

--records of student

------------------------------

insert

into `student` values (1, '

a001

', '

小明', 22

);insert

into `student` values (2, '

a005

', '

小李', 23

);insert

into `student` values (3, '

a007

', '

小紅', 24

);insert

into `student` values (4, '

a003

', '

小明', 22

);insert

into `student` values (5, '

a002

', '

小李', 23

);insert

into `student` values (6, '

a004

', '

小紅', 24

);insert

into `student` values (7, '

a006

', '

小王', 25

);insert

into `student` values (8, '

a008

', '

喬峰', 27

);insert

into `student` values (9, '

a009

', '

歐陽克', 22

);insert

into `student` values (10, '

a010

', '

老頑童', 34

);insert

into `student` values (11, '

a011

', '

黃老邪', 33

);set foreign_key_checks =

1;

匯出指令碼export.php

<?php 

set_time_limit(0);

ini_set('memory_limit', '128m');

$filename = date('ymdhis', time());

header('content-encoding: utf-8');

header('content-disposition: attachment;filename="' . $filename . '.csv"');

//注意,資料量在大的情況下。比如匯出幾十萬到幾百萬,會出現504 gateway time-out,請修改php.ini的max_execution_time引數

//開啟php標準輸出流以寫入追加的方式開啟

$fp = fopen('php://output', 'a');

//連線資料庫

$dbhost = '127.0.0.1';

$dbuser = 'root';

$dbpwd = 'root';

$con = mysqli_connect($dbhost, $dbuser, $dbpwd);

if (mysqli_connect_errno())

die('connect error');

$database = 'test';//選擇資料庫

mysqli_select_db($con, $database);

mysqli_query($con, "set names utf8");//如果需要請設定編碼

//用fputcsv從資料庫中匯出1百萬的資料,比如我們每次取1萬條資料,分100步來執行

//一次性讀取1萬條資料,也可以把$nums調小,$step相應增大。

$step = 100;

$nums = 10000;

$where = "where 1=1"; //篩選條件,可自行新增

//設定標題

$title = array('id', '編號', '姓名', '年齡'); //注意這裡是小寫id,否則id命名開啟會提示excel 已經檢測到"***.xsl"是sylk檔案,但是不能將其載入: csv 文或者xls檔案的前兩個字元是大寫字母"i","d"時,會發生此問題。

foreach ($title as $key => $item)

$title[$key] = iconv("utf-8", "gb2312//ignore", $item);

fputcsv($fp, $title);

for ($s = 1; $s <= $step; $s++) ,");

if ($result)

mysqli_free_result($result); //釋放結果集資源

ob_flush(); //每1萬條資料就重新整理緩衝區

flush();

}}mysqli_close($con);//斷開連線

匯出效果:

php匯出百萬資料到csv

set time limit 0 設定超時 ini set memory limit 100m 設定最大使用的記憶體 header content type text csv header content disposition attachment filename date ymd csv he...

PHP百萬級資料匯出csv格式OR文字格式

廢話不說,先來上乙個小小的demo header content type text csv header content transfer encoding binary for i 0 i 500000 i 將以上 儲存為乙個php檔案,然後執行,你會得到乙個50萬行記錄的檔案。當然副檔名是ph...

百萬資料優化方法

對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 sql view plain copy print?select id from t w...