php导出大量数据到excel时,有哪些比较好的处理方法?

数据量会越来越大,如果只是更改服务器超时时间,不是长久之计,希望能听到更好的建议
比如关于队列、异步等相关解决方案

阅读 3.5k
4 个回答
  • 切片
利用 iframe 去加载导出接口,完成后交给下一个切片。生成 N 个切片,关闭浏览器的(确认每个下载文件),最后在本地合并,如果只是简单的表单数据,那就直接用 csv 就好了。
  • 服务器队列
后台挂一个队列,当前端需要导出这个文件时,给队列加入一条导出信息,并给一个可以查询的回调地址,让其在后台运行,前端使用定时器定时查询是否完成,完成后提示可以下载。

导出csv就行

    $columns = ['你导出的字段','你导出的字段','你导出的字段',..........];
    $csvFileName = 'test.csv';
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="' . $csvFileName . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    $fp = fopen('php://output', 'a'); //打开output流
    mb_convert_variables('GBK', 'UTF-8', $columns);
    fputcsv($fp, $columns); //将数据格式化为CSV格式并写入到output流中


    $pagesize = '1000000'; //从数据库获取总量,假设是一百万

    $count = 1000; //每次查询的条数

    $pages = ceil($pagesize / $count);
    $output_data = [];
    for ($i = 1; $i <= $pages; $i++) {
        $output_data = ['你要导出的数据'];


        mb_convert_variables('GBK', 'UTF-8', $output_data);
        $x = fputcsv($fp, $output_data);

        unset($rs); //释放变量的内存
        unset($output_data); //释放变量的内存
        //刷新输出缓冲到浏览器
        ob_flush();
        flush(); //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
    }
    fclose($fp);

    
    
    
    代码大致就是这样,理论上来说上百万的数据都可以导出,以前查的别的大神给的例子,现在我们线上跑的这段代码 ,导出基本都没啥问题
    
    
新手上路,请多包涵

swoole

这跟队列没啥关系,只能异步和分片了。再说你不可能一次导出几百万数据到一个表里面吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题