ホームページ >バックエンド開発 >PHPチュートリアル >PHPExcel は、過剰なメモリ使用量設定のセル オブジェクト キャッシュに関連する問題を解決します
PHPExcel は過剰なメモリ使用量の問題を解決します - 設定されたセル オブジェクト キャッシュ
PHPExcel は Excel を処理するための非常に強力な PHP オープン ソース クラスですが、大きな問題はメモリを大量に消費することです。1.7.3 以降、セル キャッシュ メソッドの設定をサポートしていますが、使用することをお勧めします。現在の安定バージョン 1.7.6、以前のバージョンにはさまざまな程度のバグがあるため、以下はその公式ドキュメントです:
?
PHPExcel はセルあたり平均 1k のメモリを使用するため、大きなドキュメントではメモリの消費が非常に速くなります。セル キャッシュ メカニズムを使用すると、PHPExcel は小さなセル オブジェクトをディスク、APC、memcache、または Wincache 上のメモリにキャッシュできますが、データの読み取りには時間がかかりますが、メモリ消費量を削減できます。
?
PHPExcel_Settings::setCacheStorageMethod() メソッドを使用し、キャッシュ メソッドをパラメータとしてこのメソッドに渡して、キャッシュ メソッドを設定できます。
??
?
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory; PHPExcel_Settings::setCacheStorageMethod($cacheMethod);PHPExcel1.7.6 公式ドキュメントを書きました
?
PHPExcel1.7.6 公式ドキュメントを書きました
各ワークシートには独立したキャッシュがあり、ワークシートがインスタンス化されると、設定または構成されたキャッシュ方法に基づいて自動的に作成されます。ファイルの読み取りを開始するか、最初のワークシートを作成した後は、キャッシュ方法を変更することはできません。
?
PHPExcel1.7.6 公式ドキュメントを書きました
?
PHPExcel_CachedObjectStorageFactory::cache_in_memory;PHPExcel1.7.6 公式ドキュメントを書きました
=========================================== ===
?
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;PHPExcle1.7.6 公式ドキュメントが書きました
=========================================== ===
?
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;PHPExcel1.7.6 公式ドキュメントを書きました
?
=========================================== === ============
?
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;PHPExcel1.7.6 公式ドキュメントを書きました
?当使用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
?使用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啥时候能出一个轻量级的版本,不需要那么多花哨的功能,只需要导出最普通的数据的版本就好了!
?
2. 我嚼着,Excel 作为M$的自有的文件格式,内部隐藏了太多的咚咚。PHPExcel能做到如此的兼容性已经实属不易了。尤其是在不依靠.NET或者各种COM+库的前提下。 200MB- 的memory花费还是值得的。
$cacheSettings = array( ' memoryCacheSize ' => '8MB'
);
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
我用的是这中设置的,却只导出了10000条数据就不行了,我是想导出多个excel 一共160000条数据呢 每个excel中含有10000条数据 结果只导出了一个
看看占用内存的大小,windows用任务管理器,linux用top