资讯专栏INFORMATION COLUMN

关于数据导出超时的问题

zsy888 / 1196人阅读

摘要:实际工作中,我们经常导出报表的需求,当导出数据量过大的时候,经常会遇到超时和内存溢出的问题。解决方案一超时可用解决。获取数据,根据自己的业务逻辑,去数据库获取数据。

实际工作中,我们经常导出报表的需求,当导出数据量过大的时候,经常会遇到超时和内存溢出的问题。

解决方案一

超时可用: set_time_limit(0) 解决。

内存溢出可用: ini_set("memory_limit", "自定义内存")。

解决方案二

优化程序,利用数据库或文件来缓存中间结果。

解决方案三

利用Ajax分多次请求,写入文件,下载文件,效果如上图。

(方案三)为大家提供一个Demo

设计思路

我们将其拆成100次请求,请求成功,进度条前进1%。

每次请求都需要写入文件,然后对文件进行追加写入。

当文件写入完毕后,显示下载按钮 ,点击下载即可。

功能点

两种进度条样式。

Jquery Ajax。

数据写入CSV。

下载文件。

页面样式:Bootstrap。

代码如下

 $value) {
                $header_data[$key] = iconv("utf-8", "gbk", $value);
            }
            fputcsv($fp, $header_data);
        }
        $num = 0;
        //每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
        $limit = 100000;
        //逐行取出数据,不浪费内存
        $count = count($data);
        if ($count > 0) {
            for ($i = 0; $i < $count; $i++) {
                $num++;
                //刷新一下输出buffer,防止由于数据过多造成问题
                if ($limit == $num) {
                    ob_flush();
                    flush();
                    $num = 0;
                }
                $row = $data[$i];
                foreach ($row as $key => $value) {
                    $row[$key] = iconv("utf-8", "gbk", $value);
                }
                fputcsv($fp, $row);
            }
        }
        fclose($fp);
    }

    /**
     * 下载文件
     * @param string $file_url 文件地址
     * @return string
     */
    function _download_file ($file_url = "")
    {
        if (!isset($file_url) || trim($file_url)=="") {
            die("File URL is empty.");
        }
        if (!file_exists($file_url)) {
            die("File does not exist.");
        }
        $file_name = "down_".date("YmdHis", time());
        $file_type = fopen($file_url,"r"); //打开文件
        //输入文件标签
        header("Content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Accept-Length: ".filesize($file_url));
        header("Content-Disposition: attachment; filename=".$file_name);
        //输出文件内容
        echo fread($file_type, filesize($file_url));
        fclose($file_type);
    }

    //以后是逻辑代码,大家可以根据自己的需求进行编写。
        $path = "文件的绝对地址"; //path 是存放文件的绝对地址。
    if (isset($_POST["start"])) {
          //每一个多带带的请求,要保证文件名是唯一的,因为后面要继续进行追加。
              $file_name = "demo.csv";
        //获取数据,根据自己的业务逻辑,去数据库获取数据。
        $data        = [];
        $header_data = ["执行时间", "随机数"]; //首行数据,表头
        //模拟数据如下:
        for ($i=0; $i<=100; $i++) {
            $data[$i]["time"] = date("Y-m-d H:i:s", time());
            $data[$i]["num"]  = mt_rand(1000,9999);
        }
        $type = ($_POST["start"] != "0") ? 1 : 0 ;
        //开始将数据写入到文件中
        _export_csv($data, $header_data, $path.$file_name, $type);
        //假设第100次 写入完毕,那么就可以进行下载文件啦。
        //可以先获取需要导出的总量,然后根据实际情况进行拆分数据,每次获取成功,进度条会显示进度。
        if ($_POST["start"] == 100) {
            die(json_encode(["code" => "ok", "file_path" => "/index.php?op=down&f=".$file_name]));
        } else {
            die(json_encode(["code" => "no"]));
        }
    }

    //简单的导出逻辑,可根据实际情况,进行开发。
    if (($_GET["op"] == "down") && !empty($_GET["f"])) {
            _download_file($path.$_GET["f"]);
            exit;
    }
?>


    
      
        
        
        
        
        
        
        
        
        
        Demo
    
    
        
    
    

温馨提示:
Demo 仅供参考,具体开发,请根据需求,严谨处理。


Thanks ~

AD:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21904.html

相关文章

  • 基于haddopHDFS和Excel开源库POI导出数据报表(一)

    摘要:说明这里用到的项目都是基于的项目。但同时,它和其他的分布式文件系统的区别也是很明显的。能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。放宽了一部分约束,来实现流式读取文件系统数据的目的。是项目的一部分。 关键词 Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的...

    Nekron 评论0 收藏0
  • 基于haddopHDFS和Excel开源库POI导出数据报表(一)

    摘要:说明这里用到的项目都是基于的项目。但同时,它和其他的分布式文件系统的区别也是很明显的。能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。放宽了一部分约束,来实现流式读取文件系统数据的目的。是项目的一部分。 关键词 Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的...

    luffyZh 评论0 收藏0
  • 记一次MongoDB高负载性能优化

    摘要:年月日本文是关于记录某次游戏服务端的性能优化此处涉及的技术包括引擎随着游戏导入人数逐渐增加单个集合的文档数已经超过经常有玩家反馈说卡特别是在服务器迁移后从核降到核卡顿更严重了遂开始排查问题确认服务器压力首先使用命令查看总体情况此时占用不高 Last-Modified: 2019年6月13日11:08:19 本文是关于记录某次游戏服务端的性能优化, 此处涉及的技术包括: MongoDB...

    huhud 评论0 收藏0
  • 记一次MongoDB高负载性能优化

    摘要:年月日本文是关于记录某次游戏服务端的性能优化此处涉及的技术包括引擎随着游戏导入人数逐渐增加单个集合的文档数已经超过经常有玩家反馈说卡特别是在服务器迁移后从核降到核卡顿更严重了遂开始排查问题确认服务器压力首先使用命令查看总体情况此时占用不高 Last-Modified: 2019年6月13日11:08:19 本文是关于记录某次游戏服务端的性能优化, 此处涉及的技术包括: MongoDB...

    vibiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<