【发布时间】:2018-01-26 10:58:31
【问题描述】:
我有一个脚本可以读取附有 Excel 文件的电子邮件。
我正在使用 PHPExcel 来解析这些文件。
我目前遇到的问题是一封附有五个电子表格的电子邮件。
每次加载第五个文件时,PHP 都会耗尽内存。
最初我尝试在每次完成后都取消 ($objPHPExcel = NULL;) 和取消设置 (unset($objPHPExcel);) PHPExcel 对象
它。那没有帮助。
然后我尝试将垃圾收集添加到进程 (gc_enable(); $cycles_collected = gc_collect_cycles();)。那没有帮助。
我将当前的 php 内存使用量打印到我的错误日志中,我可以看到它随着将每个 Excel 文件加载到 PHPExcel 中而增长,我还可以看到内存使用量并没有随着每个NULL、unset 而减少或gc_collect。
以下是在 PHP 内存不足之前和之后输出到我的 error_log 的一些示例:
[17-Aug-2017 16:04:29 America/Chicago] [Blackouts] Current Memory Usage at beginning of script before loading Excel file: 85575176
[17-Aug-2017 16:04:32 America/Chicago] [Blackouts] Current Memory Usage after loading Excel file: 104474632
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] Current Memory Usage after parsing of Excel file is complete: 104480416
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] Current Memory Usage after PHPExcel object set to null: 104480536
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] Current Memory Usage after PHPExcel object is unset: 104480256
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] gc collected cycles: 0
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] Current Memory Usage after gc_collect_cycles: 104480416
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] script completed: /path/to/file/Schedule Week of 14 Aug 2017 - 21 Aug 2017.xlsx
[17-Aug-2017 16:04:34 America/Chicago] [Blackouts] Current Memory Usage at beginning of script before loading Excel file: 104484072
[17-Aug-2017 16:04:36 America/Chicago] [Blackouts] Current Memory Usage after loading Excel file: 122069128
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] Current Memory Usage after parsing of Excel file is complete: 122114480
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] Current Memory Usage after PHPExcel object set to null: 122114600
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] Current Memory Usage after PHPExcel object is unset: 122114320
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] gc collected cycles: 0
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] Current Memory Usage after gc_collect_cycles: 122114480
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] script completed: /path/to/file/Schedules Week of 14 Aug 2017 - 21 Aug 2017.xlsx
[17-Aug-2017 16:04:38 America/Chicago] [Blackouts] Current Memory Usage at beginning of script before loading Excel file: 122118192
[17-Aug-2017 16:04:39 America/Chicago] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted at Zend/zend_vm_execute.h:22207 (tried to allocate 72 bytes) in /mnt/nas_001_www/Classes/PHPExcel/Cell.php on line 551
【问题讨论】:
-
最后一张纸有多大?喜欢行和列
-
我曾经使用 phpExcel 重构过一个项目。在增加内存并使用功能强大的服务器后,生成 excel(5k+ 行)仍然需要很长时间。我最终优化了我的数据获取并切换到使用 sep=; 生成一个 csv。元数据标签,以便它可以用 excel 打开。
-
所有的纸张大小都差不多。最后一张纸是 9 列和大约 1500 行。
-
@Rienk,我很想将其转换为 csv,但不幸的是,我需要能够读取单元格颜色,因为它们向每个单元格传达了某些含义。
-
发布脚本。你一定是做错了什么。