一開始只憑自己 的直覺編寫了以下的代碼:
public function import(){
set_time_limit(0);
header('content-type:text/html;charset=UTF-8');
$filename = 'express_all.csv';
$fp = fopen($filename,"r");
while (!feof($fp)){
$line = fgetcsv($fp);
$line[0] = iconv('gb2312','utf-8',$line[0]);
$sql = 'insert into cfg_express values(NULL,"'.$line[0].'","'.$line[1].'")';
get_current_db()->query($sql);
}
fclose($fp);
echo 'success';
}
其中 iconv('gb2312','utf-8',$line[0]);
是處理亂碼的中文。
但是一請求這個接口,很迅速的報504 timeout錯誤。
修改想法1:將獲取的每行數據拼接后,批量插入。 還是504錯誤
修改想法2:將插入數據庫操作寫在另一個接口中,循環調用這個接口。還是504錯誤
修改想法3:減少文件數據量到100,以上的代碼都能實現。
所以發現是讀取csv數據量的問題,文件中總共有475行數據。(這么點數據就超時,太弱了!)
最后查到了最終解決辦法,通過yield 實現,代碼如下:
public function read_csv(){
set_time_limit(0);
header('content-type:text/html;charset=UTF-8');
$fp = fopen('express_all.csv',"rb");
while(!feof($fp)){
yield fgetcsv($fp);
}
fclose($fp);
}
public function import(){
$res = $this->read_csv();
foreach ($res as $k=>$v){
$v[0] = iconv('gb2312','utf-8',$v[0]);
$sql = 'insert into cfg_express values (NULL,"'.$v[0].'","'.$v[1].'")';
get_current_db()->query($sql);
}
echo 'success';
}