一开始只凭自己 的直觉编写了以下的代码:
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';
}