项目中生成器应用,解决量级数据导出excel内存溢出

应用场景:全量数据导出excel

遇到问题:

PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 41007872 bytes)

很明显是内存溢出。

网上给出了很多治标不治本的解决方案:

1.直接修改PHP.INI
memory_limit = xxxx M ;
2.修改.htaccess
php_value memory_limit xxx M
3.直接在程序页面上修改。
ini_set(‘memory_limit’, ‘xxx M);

上述方案都是通过调整内存大小限制,没法解决根本问题。达到更高一量级的数据,内存肯定不够用。

救星来了,生成器。

请看代码:

$list = function () use ($result, $areaList, $industryList, $channelList, $useStatusList, $billServiceFollow, $serviceOrderAmount, $statistics, $adminUserInfo, $implementerInfo, $salesInfo) {
            foreach ($result as $value) {
                $value[‘province_name‘] = $areaList[$value[‘province_id‘]] ?? ‘无‘;//省份
                $value[‘city_name‘] = $areaList[$value[‘city_id‘]] ?? ‘无‘;//城市

                $industry = $value[‘industry‘] ?? 0;
                $value[‘industry_name‘] = $industryList[$industry] ?? ‘无‘;//行业

                $channel = $value[‘channel‘] ?? 0;
                $value[‘channel_name‘] = $channelList[$channel] ?? ‘无‘;//客户来源

                $useStatus = $value[‘use_status‘];
                $value[‘contract_type‘] = $useStatusList[$useStatus] ?? ‘‘;//合同类型

                if ($useStatus == 1) {//正式合同
                    $startTime = $value[‘formal_starttime‘] ?? 0;
                    if ($startTime == ‘0000-00-00 00:00:00‘) {
                        $startTime = 0;
                    }
                    $endTime = $value[‘formal_endtime‘] ?? 0;
                    if ($startTime == ‘0000-00-00 00:00:00‘) {
                        $endTime = 0;
                    }
                    $value[‘contract_begin_date‘] = !empty($startTime) ? date(‘Y-m-d‘, strtotime($startTime)) : ‘无‘;
                    $value[‘contract_end_date‘] = !empty($endTime) ? date(‘Y-m-d‘, strtotime($endTime)) : ‘无‘;
                } else {//试用合同

                    $startTime = $value[‘tryout_starttime‘] ?? 0;
                    if ($startTime == ‘0000-00-00 00:00:00‘) {
                        $startTime = 0;
                    }
                    $endTime = $value[‘tryout_endtime‘] ?? 0;
                    if ($startTime == ‘0000-00-00 00:00:00‘) {
                        $endTime = 0;
                    }
                    $value[‘contract_begin_date‘] = !empty($startTime) ? date(‘Y-m-d‘, strtotime($startTime)) : ‘无‘;
                    $value[‘contract_end_date‘] = !empty($endTime) ? date(‘Y-m-d‘, strtotime($endTime)) : ‘无‘;
                }

                $value[‘acenum‘] = $statistics[$value[‘id‘]][‘acenum‘] ?? 0;//账套数量
                $value[‘usernum‘] = $statistics[$value[‘id‘]][‘usernum‘] ?? 0;//会计数量
                $value[‘vounum‘] = $statistics[$value[‘id‘]][‘vounum‘] ?? 0;//凭证
                $value[‘billnum‘] = $statistics[$value[‘id‘]][‘billnum‘] ?? 0;//上传票据

                //购买票据数量
                $totalServiceNum = $billServiceFollow[$value[‘id‘]][‘total_service_num‘] ?? 0;
                if ($totalServiceNum >= 100000000) {
                    $totalServiceNum = ‘不限量‘;
                }
                $value[‘total_service_num‘] = $totalServiceNum;

                //成交金额
                $value[‘total_recive_amount‘] = $serviceOrderAmount[$value[‘id‘]][‘total_recive_amount‘] ?? 0;
                $value[‘create_by_name‘] = $adminUserInfo[$value[‘create_by‘]] ?? ‘无‘;

                //实施名称
                $implementer = $value[‘implement‘] ?? 0;
                $value[‘implementer‘] = $implementerInfo[$implementer] ?? ‘无‘;

                //销售
                $sale = $value[‘sale_id‘] ?? 0;
                $value[‘sale‘] = $salesInfo[$sale] ?? ‘无‘;

                $abutment = $value[‘abutment‘] ?? 0;
                $value[‘abutment‘] = $salesInfo[$abutment] ?? ‘无‘;
                yield $value;
            }
        };

        $data[‘list‘] = $list();

        //调用下载excel
        $excel = new DownloadExcel();
        return $excel->title(‘客户列表‘)->subtitle(‘‘)->subject(‘‘)->fill(‘company-list‘, $data)->download();

解决问题:

内存溢出

知识点说明:

1.将大结果集的数据单元yield,传给生成器。
2.通过function()use{};匿名函数接收生成器作为结果。

$data[‘list‘] = $list();

后续只需要迭代$data[‘list‘]即可。

原文地址:http://blog.51cto.com/phpme/2173132

时间: 2024-10-11 20:45:37

项目中生成器应用,解决量级数据导出excel内存溢出的相关文章

JAVA关于POI导出Excel内存溢出的解决方案

JAVA关于POI导出Excel内存溢出的解决方案 在我们使用JAVA开发过程中,经常要导出查询获得的数据,这些数据一般情况下都是以Excel存储的,因此我们在导出数据的时候要使用JAVA的POI库,其主要是对各种windows平台的数据格式进行操作,在这里,我们是对Excel操作. 生成Excel的过程原理是这样的,首先,我们对数据库进行查询,获取相应的结果集,一般是list集合,然后生成Workbook对象,根据生成的Workbook对象获取sheet对象,根据此sheet对象获取Row对象

有时候我们在项目中需要录入大量的数据,Excel操作

1:首先需要在项目中导入架包: jxl.jar, poi-3.6-20091214.jarpoi-3.8-beta5-20111217.jarpoi-examples-3.6-20091214.jarpoi-examples-3.8-beta5-20111217.jarpoi-excelant-3.8-beta5-20111217.jarpoi-ooxml-3.6-20091214.jarpoi-ooxml-3.8-beta5-20111217.jarpoi-ooxml-schemas-3.6-

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab

.net解决数据导出excel时的格式问题

在项目中一般都需要将报表数据导出到EXCEL中,但经常出现导出长串数据(如身份证)到EXCEL中后显示为科学计数法的格式,或者报表中显示为001的数据导出到Excel后成了1的格式. 下面简单介绍一下以上问题的解决方法: 1.首先,了解一下excel从web页面上导出的原理.当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读 取它,所以把mime类型设为:application/vnd.ms-excel,当excel读取文件时会以每个cell的格式呈现数据,如果 c

将页面中表格数据导出excel格式的文件(vue)

近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安装可能会出现某些错误,可以使用cnpm): npm install file-saver --save // 保存文件用 npm install xlsx --save // 转二进制用 npm install script-loader --save-dev // xlsx核心文件 2.下载两个核

项目中需要将获取的数据按照顺序读取并且展示

1 项目中需要将获取的数据按照顺序读取并且展示的时候的实例, 2 下面截图是将获取到的小区的照片.按照获取的顺序同步到ES 搜索服务器上 3 用到的JSON包是alibaba.fastjson包,此包可以将获取的数据存放在指定的集合中,在此项目中就是定义了LinkedHashMap

Java使用POI实现数据导出excel报表

在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF .所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表.在java中有很多实现数据导出excel报表的第三方jar包.但在比较了一下感觉还是POI相对来

大量数据导出excel(csv)的实现

<?php /** * 大量数据导出excel(csv)的实现. * Created by PhpStorm. * User: Huming * Date: 2017-04-16 * Time: 14:04 * */ //使用MS sqlserver数据测试的 require_once 'MSSqlServerHelper.php'; $sqlHelper = new MSSqlServerHelper(); set_time_limit(0); ini_set('memory_limit',

百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?

好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系方式地址等数据,这便成为很多人的便捷方式.但是一个个地复制出来商家的电话,地址是一件很痛苦的事情, 于是想到开发一个程序,模拟人的操作,将所有的数据提取保存到EXCEL里. 交流学习QQ:3125547039 主要代码思路: m_objConnection.Open();             b