PHP 实时生成并下载超大数据量的 Excel 文件
12

    //另外由于excel数据是从数据库里逐步读出然后写入输出流的所以需要将PHP的执行时间设长一点
    //(默认30秒)set_time_limit(0)不对PHP执行时间做限制。
    set_time_limit(0);
    $columns = [
       '文章ID', '文章标题', ...... //'openid'
    ];
    //处理需要导出的数据
    $timeStart = strtotime('2018-08-08 00:00:00');
    $timeEnd = strtotime('2018-08-08 23:59:59');
    $arr = DB::table('t_wechat_user_wx4ed9e1f4e0f3eeb0')->select(DB::raw('distinct openid'))->where('subscribe_time','>=',$timeStart)->where('subscribe_time','<=',$timeEnd);

    $csvFileName = '8月8号新增粉丝openid.xlsx';
    //设置好告诉浏览器要下载excel文件的headers
    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流中
    $accessNum = $arr->count();//从数据库获取总量,假设是一百万
    $perSize = 1000;//每次查询的条数
    $pages   = ceil($accessNum / $perSize);
    $lastId  = 0;
    for($i = 1; $i <= $pages; $i++) {
        //需要导出的数据
        $accessLog = $arr->offset($lastId)->limit($perSize)->get(['openid'])->toArray();
        foreach($accessLog as $access) {
            $rowData = [
                ......//每一行的数据  $access->openid
            ];
            mb_convert_variables('GBK', 'UTF-8', $rowData);
            fputcsv($fp, $rowData);
            $lastId ++;
        }
        unset($accessLog);//释放变量的内存
        //刷新输出缓冲到浏览器
        ob_flush();
        flush();//必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
    }
    fclose($fp);
    exit();
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 4
Littlesqx

这就是 csv 为什么还有指定拓展名为 xlsx

4个月前
736713830

记得有个 chunk 查询 了解一下..

4个月前

id如果不连续有问题吧

for($i = 1; $i <= $pages; $i++) {
       $skip = $i*$perSize ;//
        //需要导出的数据
        $accessLog = $arr->offset($skip)->limit($perSize)->get(['openid'])->toArray();
        foreach($accessLog as $access) {
            $rowData = [
                ......//每一行的数据  $access->openid
            ];
            mb_convert_variables('GBK', 'UTF-8', $rowData);
            fputcsv($fp, $rowData);
           // $lastId ++;
        }
        unset($accessLog);//释放变量的内存
        //刷新输出缓冲到浏览器
        ob_flush();
        flush();//必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
    }
3个月前

超量数据的性能问题可有什么好的优化方法?

3周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!