PHP导出大量数据到csv文件

这个导出有很多人写过,我只是看到后自己测试了一下 

以下代码是在Yii2中写的测试导出50万的数据在一分钟左右,只有这个9个字段,字段数量可能也会影响导出速度

public function actionIndex()
    {
        ini_set('memory_limit', '1024M');
        set_time_limit(0);

        //列标题
        $tableheader = array(
            'A' => 'id',
            'B' => '店铺ID',
            'C' => '店铺',
            'D' => '商品编号',
            'E' => '条形码',
            'F' => '商品名称',
            'G' => '更新前数量',
            'H' => '更新后数量',
            'I' => '更新时间',
        );

        $fileName = date('YmdHis', time());
        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');

        //有时会需要转码
        // foreach ($tableheader as $key => $item)
        // {
        //     $tableheader[$key] = iconv("UTF-8", "GB2312//IGNORE", $item);
        // }
        fputcsv($fp, $tableheader);

        for ($i=0; $i<1; $i++)
        {
            $data = GoodsAnalysisLog::find()->offset($i * 10000)->limit(10000)->asArray()->all();
            foreach ($data as $k=>$v)
            {
                //有时会需要转码
                // foreach ($row as $key => $item)
                // {
                //     $row[$key] = iconv("UTF-8", "GBK", $item); 
                //     //这里必须转码,不然会乱码
                // }
                foreach ($v as $key => $item)
                {
                    if ($key=='barcode') {
                        $v[$key] = $v[$key]; 
                    }
                }
                fputcsv($fp, $v);
            }
            ob_flush();  //每1万条数据就刷新缓冲区
            flush();
        }
        ob_end_clean();
        exit;//如果不加这个退出,会在文件结尾有报错信息
    }

 

你可能感兴趣的:(PHP)