您现在的位置是:网站首页>>PHP>>php

php实现百万级数据快速导出CSV

发布时间:2020-12-09 17:25:58作者:wangjian浏览量:243点赞量:0

    php实现百万级数据导出这里使用了服务器的缓存来实现

    实现:

    一:建立测试表,并加入测试数据

    1:创建测试表

    这里我建了一个test表,字段分别为:id,name,age,email

    2:加入测试数据

    (1)首先手动向表中添加若干行数据

    然后执行如下命令批量添加数据

    INSERT INTO test (name,age,email) SELECT name,age,email FROM test;

    多次执行上面的命令测试数据会呈指数增加,这样就可以得到很多测试数据

    二:php实现导出百万级数据(这里我的查询命令使用的时Yii框架自带的查询命令)

    //让程序一直运行
    set_time_limit(0);
    //设置程序运行内存
    ini_set('memory_limit', '128M');
    //导出文件名
    $fileName = '测试导出数据';
    header('Content-Encoding: UTF-8');
    header("Content-type:application/vnd.ms-excel;charset=UTF-8");
    header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
    //打开php标准输出流
    $fp = fopen('php://output', 'a');
    //添加BOM头,以UTF8编码导出CSV文件,如果文件头未添加BOM头,打开会出现乱码。
    fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
    //添加导出标题
    fputcsv($fp, ['姓名', '岁数', '邮箱']);
    $nums = 10000; //每次导出数量
    $count = Test::find()->count();
    $step = ceil($count/$nums);//循环次数
    for($i = 0; $i < $step; $i++) {
        $result = Test::find()
            ->select(['name', 'age', 'email'])
            ->limit($nums)
            ->offset($i * $nums)
            ->asArray()
            ->all();
        foreach ($result as $item) {
            fputcsv($fp, $item);
        }
        //每1万条数据就刷新缓冲区
        ob_flush();
        flush();
    }
    exit;

    如上测试后可以发现导出一百万左右数据只需十几秒左右时间,效率还算是不错的

    参考:https://blog.csdn.net/weixin_41635750/article/details/109821604

0 +1