php csv文件读取

一开始只凭自己 的直觉编写了以下的代码:

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';
    }

你可能感兴趣的:(php csv文件读取)