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

发布于 2022-09-11 20:58:21 字数 67 浏览 13 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

独行侠 2022-09-18 20:58:21
  • 切片

利用 iframe 去加载导出接口,完成后交给下一个切片。生成 N 个切片,关闭浏览器的(确认每个下载文件),最后在本地合并,如果只是简单的表单数据,那就直接用 csv 就好了。

  • 服务器队列

后台挂一个队列,当前端需要导出这个文件时,给队列加入一条导出信息,并给一个可以查询的回调地址,让其在后台运行,前端使用定时器定时查询是否完成,完成后提示可以下载。

相权↑美人 2022-09-18 20:58:21

导出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);

    
    
    
    代码大致就是这样,理论上来说上百万的数据都可以导出,以前查的别的大神给的例子,现在我们线上跑的这段代码 ,导出基本都没啥问题
    
    
故乡的云 2022-09-18 20:58:21

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文