php中导出大量数据excel 有哪些方案的?除了异步导出这种

php中导出大量数据excel 有哪些方案的?除了异步导出这种

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 12
gongmeng

刚好我今天这里有篇讨论的文章,你可以看看 分享:PHP百万数据级导出excel

1年前 评论

我感觉涉及到你说的大量,如果不使用异步导出的话,可以设置不超时,可以固定内存导出(游标读取一行一行插入,不会导致内存溢出),这些都没有问题。不过用户操作这方面就会有点不好了,用户会一直卡在这里等,一直等到导出完成,无法操作其他功能。我个人感觉大数据导出,应该用异步比较合适

1年前 评论

我是放入异步的队列,用队列处理器导出的。

1年前 评论

可以分页切片查询,比如一次1000条数据 单行追加写入cvs文件流,然后flush输出给浏览器,用户在浏览器上可以看到一直在下载, 低配服务器,单表查询7列,下载文件大小100M的csv文件下载需要 3分钟左右。

        $fileName = $planId . '_' . date('YmdHis');
        set_time_limit(0);
         //设置程序运行内存
        ini_set('memory_limit', '200M');
        header('Content-Encoding: UTF-8');
        header("Content-type:application/vnd.ms-excel;charset=UTF-8");
        header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
         //打开文件
        $fp = fopen('php://output', 'a');
        //添加BOM头,以UTF8编码导出CSV文件,如果文件头未添加BOM头,打开会出现乱码。
        fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
        fputcsv($fp, $title);

        SendLog::where('plan_id', $planId)->chunk(5000, function ($smsLogs) use ($fp) {
            foreach ($smsLogs->toArray() as $v) {
                if ($v['send_status'] == SmsLog::SEND_SUCCESS) {
                    $v['send_status'] = 'success';
                } else if ($v['send_status'] == SmsLog::QUEUED_STATUS){
                    $v['send_status'] = 'queued';
                } else {
                    $v['send_status'] = 'fail';
                }
                $exportData = [
                    $v['to_phone'] . "\t",
                    $v['username']. "\t",
                ];
                fputcsv($fp, (array)$exportData);
            }
            //数据从PHP的缓冲中释放出来
            ob_flush();
            // 被释放出来的数据发送到浏览器
            flush();
        });
1年前 评论
test2018 (楼主) 1年前

瓶颈在于你怎么导出,如果是百万的SQL结果,光结果的组织就需要很多时间了,写excel其实用不了多少时间。

1年前 评论
xiaochong0302

导出 excel 和 csv 差别很大的,关键是如何不爆内存

1年前 评论

不想异步的话,就只能按照 @一只码 的方法,导出 csv,而且这种方法在数据量大时,会因为一个很小的网络波动而中断

1年前 评论

建议使用js导出,js请求接口,一页一页的合并到csv文件中去,有进度条,可断点续传,只要接口不崩,多少数据都能导出来,无非就是时间问题,建议是专门出导出接口,以最大化利用数据库性能

1年前 评论
随波逐流

同步导出,最佳方案 ob + csv

1年前 评论
test2018

我的导出是基于一个模板(有样式 在上面填充数据) 所以 楼上说的 csv这些不适用 并且xlswriter 这个扩展 我好像没看到可以读取模板然后填充数据的?

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!