文件太大了,考慮使用分段處理,每次返回一小段。如果執(zhí)行時間無限長的話服務負載大,極有可能使用。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供囊謙企業(yè)網站建設,專注與網站建設、網站設計、H5場景定制、小程序制作等業(yè)務。10年已為囊謙眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網站設計公司優(yōu)惠進行中。
框架用的是ci,數(shù)據(jù)庫是sqlsrv(sql server 2008),sql查詢返回的結果集有2萬條數(shù)據(jù),我在ci框架里面執(zhí)行這個sql語句,網頁一直在轉圈,2萬條數(shù)據(jù)要轉30秒左右,但是我的sql語句在sql server 2008 R2 里面執(zhí)行 是秒查,在ci里面用自帶查詢sql執(zhí)行時間是200毫秒,,說明我的語句并不慢。個人覺得應該是返回數(shù)據(jù)太多導致慢的,返回的是2萬條數(shù)據(jù),20個字段左右,,因為我做的是統(tǒng)計 ,要把數(shù)據(jù)導出成csv文件,所以數(shù)據(jù)比較多,這個該怎么處理?
我的sql 語句是select * from table where create_time between 'xxxx-xx-xx 00:00:00' and 'xxxx-xx-xx 23:59:59'; 是根據(jù)時間段來的 如果用戶選擇的時間范圍小 那數(shù)據(jù)就少 如果范圍大 那數(shù)據(jù)就大 數(shù)據(jù)大的時候就很慢
public function aa(){
$sql ="select * from table where create_time between 'xxxx-xx-xx 00:00:00' and 'xxxx-xx-xx 23:59:59'";
$result=$this-db-query($sql)-result_array();
}
這已經是最簡單的查詢了,sql語句秒查,但是用瀏覽器執(zhí)行就很慢,
我在瀏覽器里面執(zhí)行 , 如果查詢結果幾萬條的話 瀏覽器就一直轉圈,要等四十多秒,500條足有數(shù)據(jù)是3、4秒
我在想是不是result_array()這一步 需要循環(huán)需要花費太多的時間,本身記錄就有幾萬條,然后還有二十個字段
==============2017-05-16 16:01更新===============
我沒有用ci框架自帶的result_array() ,查看ci框架文檔的時候看到一段話:
經常的,你會需要提供一個數(shù)據(jù)庫的 connection ID 或是一個 result ID, connection ID 可以這樣來
$this-db-conn_id;
result ID 可以從查詢返回的結果對象獲取,像這樣:
$query = $this-db-query("SOME QUERY");
$query-result_id;
于是我修改了我的代碼 拿 result_id 去循環(huán)讀取每條記錄
$sql ="select xxx";
$query=$this-db-query($sql);
//這里因為我用的是sqlsrv 所以使用的是sqlsrv_fetch_array 來循環(huán)讀取每一行
//然后每讀一行 就寫如csv文件
while($row=sqlsrv_fetch_array($query-result_id,SQLSRV_FETCH_ASSOC)){
//這里是把row 寫入csv文件的代碼
}
具體的代碼就是下面了
$sql="xxx";
$query=$this-db-query($sql);
$filename= "CostDetail.csv";//導出的文件名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
// 打開PHP文件句柄,php://output 表示直接輸出到瀏覽器
$fp = fopen('php://output', 'a');
// 輸出Excel列名信息
$head = array(xxx);
foreach ($head as $i = $v) {
// CSV的Excel支持GBK編碼,一定要轉換,否則亂碼
$head[$i] = iconv('utf-8', 'gbk', $v);
}
// 將數(shù)據(jù)通過fputcsv寫到文件句柄
fputcsv($fp, $head);
// 計數(shù)器
$cnt = 0;
// 從數(shù)據(jù)庫中獲取數(shù)據(jù),為了節(jié)省內存,不要把數(shù)據(jù)一次性讀到內存,從句柄中一行一行讀即可
$limit = 5000;
while ($row=sqlsrv_fetch_array($query-result_id,SQLSRV_FETCH_ASSOC)){
$cnt ++;
if ($limit == $cnt) { //刷新一下輸出buffer,防止由于數(shù)據(jù)過多造成問題
ob_flush();
flush();
$cnt = 0;
}
//這里是把每個字段的編碼轉成gbk
$newRow[] = $this-_mb_convert_encoding($row['edis_orgsoid']);
....
unset($row);
fputcsv($fp, $newRow);
unset($newRow);
}
exit;
這樣能導出文件 但是我看了一下 19204行的,16列 的csv文件 3M左右 , 需要40-45秒的時間才能導出好,,我想問這時間還能優(yōu)化的再快點嗎
關于csv格式
如果內容中有逗號,可以把整個字段用引號括起來,具體可參考百度百科csv。
例如
字段1,“字段2帶,號”,字段3
其實,關鍵在于php讀取csv的規(guī)則,csv并不是一定要用逗號,也可以是分號等其他符號。
改一下對應的php讀取規(guī)則即可。
當前名稱:php大批量數(shù)據(jù)返回 php返回500
網頁網址:http://muchs.cn/article0/ddijeoo.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供Google、搜索引擎優(yōu)化、網站排名、建站公司、響應式網站、動態(tài)網站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)