PHP导入百万级数据到csv文件

网上看到很多导入百万级数据到CSV文件的代码,自己都去试过,大部分都是会出现数据太大导致内存溢出,偶然间看到PHP的生成器的使用,终于找到了解决方案(所需内存很小,大概几十M足够,具体看你每次获取的数据的范围),具体我以THINKPHP5.1版本为例进行测试,具体如下:

我的环境是LNMP,PHP版本是PHP7.2

  1. 编写一个Csv.php类放入extend目录下,如下:
where($where)->order($pk . ' DESC')->limit(1)->value($pk);
        } else {
            $lastIdValue = Db::name($table)->order($pk . ' DESC')->limit(1)->value($pk);
        }

        for ($i = 1;$i < $lastIdValue;$i = $i + $step) {

            //这里获取生成器返回的生成器对象
            if (!empty($where)) {
                $cursor = Db::name($table)->where($pk, 'between', [$i, $j])->where($where)->cursor();
            } else {
                $cursor = Db::name($table)->where($pk, 'between', [$i, $j])->cursor();
            }


            foreach ($cursor as $v){
                $calc++;
                //-------核心!!!清空缓存,将缓存上的数据写入到文件--------
                if($limit == $calc){
                    ob_flush();//将本来存在输出缓存中的内容取出来,调用ob_flush()之后缓冲区内容将被丢弃。
                    flush();   //待输出的内容立即发送。
                    $calc = 0;
                }
                //-------核心--------
                $arr = [];
                foreach ($showKeys as $key) {
                    if (isset($v[$key])) {
                        $arr[] = $v[$key];
                    }
                }
                foreach($arr as $t){
                    $tarr[] = iconv('UTF-8', 'GB2312//IGNORE',$t);
                }
                fputcsv($file,$tarr);//将行格式化为 CSV 并写入一个打开的文件中。(内容)
                unset($tarr);//销毁指定的变量
            }

            $j = $j + $step;
        }

        //unset($list);//销毁指定的变量
        fclose($file);//关闭打开的文件
    }
}

2,控制器中调用类导出到CSV文件

public function testPutCsv() {
        set_time_limit(0);
        $fileName = 'test.csv';
        $title = ['url地址', '添加时间', '状态'];
        $showKeys = ['url', 'add_time', 'status'];
        $where = [
            'status' => 0
        ];
        $csv = new Csv();
        $csv->putCsv($fileName, $title, $showKeys, 'use_qrcode', 'id', $where);

    }

 

你可能感兴趣的:(php,Thinkphp)