- 浏览: 338702 次
- 性别:
- 来自: 北京
博客专栏
-
高性能PHP框架Yii分析...
浏览量:84899
文章分类
最新评论
-
huxiaoyunhust:
价值观这种东西,说不好听是口号,其实是公司每天潜移默化的感染, ...
关于企业价值观的一点点感悟 -
silentime:
stef831018 写道你想多了,企业价值观就两个字:利益怎 ...
关于企业价值观的一点点感悟 -
stef831018:
你想多了,企业价值观就两个字:利益
关于企业价值观的一点点感悟 -
guoyuqiangf8:
关于企业价值观的一点点感悟 -
silentime:
mangguo 写道推荐大家去看看我写的python入门,可以 ...
python如何打印变量的类型
PHPExcel是一个很强大的处理Excel的PHP开源类,但是很大的一个问题就是它占用内存太大,从1.7.3开始,它支持设置cell的缓存方式,但是推荐使用目前稳定的版本1.7.6,因为之前的版本都会不同程度的存在bug,以下是其官方文档:
PHPExcel uses an average of about 1k/cell in your worksheets, so large workbooks can quickly use up available memory. Cell caching provides a mechanism that allows PHPExcel to maintain the cell objects in a smaller size of memory, on disk, or in APC, memcache or Wincache, rather than in PHP memory. This allows you to reduce the memory usage for large workbooks, although at a cost of speed to access cell data.
PHPExcel平均下来使用1k/单元格的内存,因此大的文档会导致内存消耗的也很快。单元格缓存机制能够允许PHPExcel将内存中的小的单元格对象缓存在磁盘或者APC,memcache或者Wincache中,尽管会在读取数据上消耗一些时间,但是能够帮助你降低内存的消耗。
默认情况下,PHPExcel依然将单元格对象保存在内存中,但是你可以自定义。你可以使用PHPExcel_Settings::setCacheStorageMethod()方法,将缓存方式作为参数传递给这个方法来设置缓存的方式。
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory; PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
setCacheStorageMethod()方法会返回一个BOOL型变量用于表示是否成功设置(比如,如果APC不能使用的时候,你设置使用APC缓存,将会返回false)
每一个worksheet都会有一个独立的缓存,当一个worksheet实例化时,就会根据设置或配置的缓存方式来自动创建。一旦你开始读取一个文件或者你已经创建了第一个worksheet,就不能在改变缓存的方式了。
目前,有以下几种缓存方式可以使用:
PHPExcel_CachedObjectStorageFactory::cache_in_memory;
默认情况下,如果你不初始化任何缓存方式,PHPExcel将使用内存缓存的方式。
===============================================
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;
使用这种缓存方式,单元格会以序列化的方式保存在内存中,这是降低内存使用率性能比较高的一种方案。
===============================================
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
与序列化的方式类似,这种方法在序列化之后,又进行gzip压缩之后再放入内存中,这回跟进一步降低内存的使用,但是读取和写入时会有一些慢。
===========================================================
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
The temporary disk file is automatically deleted when your script terminates.
当使用cache_to_discISAM这种方式时,所有的单元格将会保存在一个临时的磁盘文件中,只把他们的在文件中的位置保存在PHP的内存中,这会比任何一种缓存在内存中的方式都慢,但是能显著的降低内存的使用。临时磁盘文件在脚本运行结束是会自动删除。
===========================================================
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
类似cache_to_discISAM这种方式,使用cache_to_phpTemp时,所有的单元格会还存在php://temp I/O流中,只把他们的位置保存在PHP的内存中。PHP的php://memory包裹器将数据保存在内存中,php://temp的行为类似,但是当存储的数据大小超过内存限制时,会将数据保存在临时文件中,默认的大小是1MB,但是你可以在初始化时修改它:
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; $cacheSettings = array( ' memoryCacheSize ' => '8MB' ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
php://temp文件在脚本结束是会自动删除。
===========================================================
PHPExcel_CachedObjectStorageFactory::cache_to_apc;
当使用cach_to_apc时,单元格保存在APC中,只在内存中保存索引。APC缓存默认超时时间时600秒,对绝大多数应用是足够了,当然你也可以在初始化时进行修改:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_APC; $cacheSettings = array( 'cacheTime' => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
当脚本运行结束时,所有的数据都会从APC中清楚(忽略缓存时间),不能使用此机制作为持久缓存。
===========================================================
PHPExcel_CachedObjectStorageFactory::cache_to_memcache
By default, PHPExcel looks for a memcache server on localhost at port 11211. It also sets a memcache timeout limit of 600 seconds. If you are running memcache on a different server or port, then you can change these defaults when you initialise cache_to_memcache:
使用cache_to_memory时,单元格对象保存在memcache中,只在内存中保存索引。默认情况下,PHPExcel会在localhost和端口11211寻找memcache服务,超时时间600秒,如果你在其他服务器或其他端口运行memcache服务,可以在初始化时进行修改:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; $cacheSettings = array( 'memcacheServer' => 'localhost', 'memcachePort' => 11211, 'cacheTime' => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
从初始化设置的形式上看,MS还不支持多台memcache服务器轮询的方式,比较遗憾。
当脚本结束时,所有的数据都会从memcache清空(忽略缓存时间),不能使用该机制进行持久存储。
===========================================================
PHPExcel_CachedObjectStorageFactory::cache_to_wincache;
使用cache_towincache方式,单元格对象会保存在Wincache中,只在内存中保存索引,默认情况下Wincache过期时间为600秒,对绝大多数应用是足够了,当然也可以在初始化时修改:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_wincache; $cacheSettings = array( 'cacheTime' => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
呃,终于“又”写完了,之前写的一版,有的文字是直接从word粘过来的,带了一大堆格式,被截断了,悲了个剧的,翻译文档也不是件容易的事啊……PHPExcel还是比较强大的,最大的问题就是内存占用的问题,我之前用的1.7.2,还没有这种机制,导出2W+数据,占用了400M+内存,改成1.7.6,使用cach_to_diskISAM方式,内存降低到200M-,效果还是很明显的,不过依然还是够高的,excel文件5.1M,就使用了200M-和未知大小的磁盘空间,PHPExcel啥时候能出一个轻量级的版本,不需要那么多花哨的功能,只需要导出最普通的数据的版本就好了!
评论
看看占用内存的大小,windows用任务管理器,linux用top
$cacheSettings = array( ' memoryCacheSize ' => '8MB'
);
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
我用的是这中设置的,却只导出了10000条数据就不行了,我是想导出多个excel 一共160000条数据呢 每个excel中含有10000条数据 结果只导出了一个
2. 我嚼着,Excel 作为M$的自有的文件格式,内部隐藏了太多的咚咚。PHPExcel能做到如此的兼容性已经实属不易了。尤其是在不依靠.NET或者各种COM+库的前提下。 200MB- 的memory花费还是值得的。
发表评论
-
[转]PHP的内存管理
2015-05-11 22:03 885原文出处:http://blogread.cn/it/ar ... -
《高性能PHP应用开发》读书笔记
2014-12-24 09:20 794注:只记录了一些关键点,部分知识点/内容请看到的朋友 ... -
[转]HTTP缓存算法
2013-01-04 14:34 1351原文地址:http://www.p ... -
【转】漫谈社区PHP 业务开发
2012-11-19 10:07 1117原文地址:http://stblog.baidu-tech.c ... -
Yii分析13:Yii核心组件之AssetManager
2012-04-10 00:37 4396我们通过使用来讲解CAssetManager的使用和工 ... -
Yii分析12:Yii核心web组件之会话类CHttpSession
2012-03-06 09:44 3228CHttpSession提供session级的数据管理和配置 ... -
Yii分析11:Yii核心组件之错误处理类CErrorHandler
2012-02-24 09:57 4133类如其名,CErrorHandler在Yii中主要的功能 ... -
Yii分析10:Yii核心组件之数据库类CDbConnection
2012-02-17 09:18 8539数据库类几乎是每个PHP框架必不可少的组件之一,Yii的 ... -
Yii分析9:CController控制视图(Cview)的展现
2011-11-30 00:01 4876《The Definitive Guide to ... -
[转]优酷网架构学习笔记
2011-11-22 10:22 1444原文地址:http://www.itivy.com/ivy/a ... -
[转]YouTube架构学习体会
2011-11-22 10:15 1217原文地址:http://www.itivy.com/ivy/a ... -
[转]深掘XSS漏洞场景之XSS Rootkit
2011-10-21 12:22 1358转载顿神大作:http://www.80sec.com/%E6 ... -
Yii分析7:runController的执行
2011-10-20 17:28 6007在《Yii分析4:run的执行》一文中,介绍了Yi ... -
关于PHP错误:unexpected T_PAAMAYIM_NEKUDOTAYIM
2011-10-08 16:23 1959PHP解析错误:Parse error: syntax err ... -
[推荐]基于PHP和MySQL的开源点击统计软件Piwik
2011-08-10 11:50 1755刚刚发现一款基于PHP和MySQL的开源点击统计软 ... -
PHP的is_callable和method_exists方法比较
2011-08-03 13:17 2213之前发过一篇关于is_callable的文章,主要是PHP手册 ... -
Yii分析6:CHttpRequest
2011-08-03 11:20 2892官方说明:CHttpRequest封装了$_SERVER变量, ... -
[转]10种方式实现跨域资源的共享
2011-07-27 10:50 1063原文地址:http://www.ued16 ... -
[转]高级PHP应用程序漏洞审核技术
2011-07-19 10:18 1921原文地址:http://code.google.com/p/p ... -
使用PHP的SESSION直接保存对象需要注意隐含的序列化
2011-06-23 14:12 3391昨天在调试代码时,在同一个sever上有两个版本的代码,刚开始 ...
相关推荐
Memcached是一个高性能的分布式内存对象缓存系统,可以用来缓存PHPExcel生成的单元格数据。这种方法适合于多个PHP脚本实例之间共享缓存数据的场景。 通过改变缓存方式,开发者可以有效降低内存消耗,从而解决内存...
5. **缓存策略**:利用`PHPExcel_Shared_CachedObjectStorage`类实现对象缓存,减少内存消耗。 总之,PHPExcel-1.8是PHP环境中处理Excel文件的强大工具,尤其适用于Web应用程序中的数据导入导出。通过掌握其基本...
9. **性能优化**:由于处理大型Excel文件可能导致内存占用过高,可以使用`disconnectWorksheets()`释放不再使用的资源,或者在写入时使用`setUseDiskCaching()`启用磁盘缓存。 10. **版本与替代品**:需要注意的是...
- **单元格缓存**: 控制单元格数据在内存中的存储方式。 - **默认模式**: `PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp()` - **自定义模式**: 如`PHPExcel_CachedObjectStorageFactory::cache_to_...
PHPExcel在内存中存储整个电子表格,允许快速访问和修改,但这也意味着对于大型工作簿,可能会占用大量内存。 3.4. 读取与写入 PHPExcel支持多种读取和写入电子表格的格式,如CSV、Excel BIFF (xls)、...
- **FAQ**: 常见问题解答可以帮助解决大部分使用过程中遇到的问题。 - **教程**: 官方网站提供了丰富的教程资源,帮助快速上手。 #### 三、架构设计 **3.1 架构概览** PHPExcel 的核心组件包括工作簿、工作表、...
- **性能优化**:合理利用缓存机制,减少不必要的计算和内存占用。 5. **扩展应用**: - **数据导出**:在Web应用中,常用于将数据库查询结果导出为Excel,方便用户下载和分析。 - **报表生成**:自定义模板,...
2. 利用缓存机制,减少对内存的占用。 3. 错误处理和日志记录,确保在出现问题时能及时定位和解决。 总的来说,PHPExcel是PHP开发人员处理Excel文件的利器,无论是简单的数据导出还是复杂的报表生成,都能轻松应对...
- 大量数据处理可能导致内存占用过高,需要合理设置内存限制和分页导出。 - 对于复杂格式,如图表、公式等,PHPExcel可能无法完美支持。 - PHPExcel已被弃用,推荐使用其后继项目`phpspreadsheet`,它修复了部分...
- **内存管理**: 处理大量数据时注意内存占用,可以分批读写或使用内存优化策略。 - **错误处理**: 捕获并处理可能出现的异常,如文件不存在、格式不正确等。 - **性能优化**: 避免不必要的计算,减少循环次数,...
此外,为了优化性能,可能需要使用内存和CPU的控制策略,例如分块读取大文件,或设置缓存机制。 在使用PHPExcel时,注意处理异常和错误,确保文件读写的安全性。同时,由于PHPExcel的资源消耗较大,对于大数据量的...
3. **数据导出**:通过创建PHPExcel对象,开发者可以添加工作表、设置单元格值、格式化样式、应用公式,然后使用Writer接口将这些内容导出为Excel文件。例如,可以使用`PHPExcel_IOFactory::createWriter()`创建一个...
- **内存管理**:由于PHPExcel可能会占用大量内存,因此在处理大文件时,可以使用内存优化模式或分批读写来避免内存溢出。 - **缓存策略**:通过设置不同的缓存策略,如内存映射、XML文件存储,可以平衡性能和资源...
为了提高处理大量数据的效率,这个类库可能实现了缓存策略,如只读取需要的行或列,或者使用内存映射技术减少内存占用。 7. **安全措施** 类库可能会包含安全相关的功能,比如防止XSS攻击,过滤非法字符,以及...
2. **内存管理**:由于PHPExcel在内存中处理整个工作簿,处理大文件时可能导致内存占用过高。为此,可以利用其提供的chunk读写功能来分批处理数据。 3. **性能优化**:在处理大量数据时,可以开启缓存机制,如使用...
PHPExcel支持Excel的大部分内置公式,可以直接在单元格中设置。例如,计算两单元格之和: ```php $objPHPExcel->getActiveSheet()->setCellValue('C1', '=A1+B1'); ``` 6. **处理大量数据**: 对于大数据操作...
- 写入Excel:创建Writer对象,逐行写入数据,同样不占用大量内存。 - 支持流式处理:Spout支持在文件很大时进行流式读写,非常适合大数据处理。 4. 自定义实现: 如果是自定义的PHP Excel类,可能会利用PHP的...