PHP的Excel内存限制2GB用尽阅读一个286KB的文件
Addtitional info:我从命令行运行这个。 CentOS 6,32GB总计,2GB的PHP内存。 我试图增加内存限制到4GB,但现在我得到一个Fatal error: String size overflow
。 PHP的最大string大小是2GB 。
我的代码很简单testing代码:
$Reader = new SpreadsheetReader($_path_to_files . 'ABC.xls'); $i = 0; foreach ($Reader as $Row) { $i++; print_r($Row); if($i>10) break; }
而且只打印10行。 这是2千兆字节的内存?
错误发生在excel_reader2.php的第253行
里面的类OLERead
里面function read($sFilenName)
这是导致我筋疲力尽的代码:
if ($this->numExtensionBlocks != 0) { $bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4; } for ($i = 0; $i < $bbdBlocks; $i++) { // LINE 253 $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); $pos += 4; }
我解决了这个问题。 事实certificate,这与PHP代码有些无关。
我正在写的程序从电子邮件和FTP下载.xls
, .xlsx
和.csv
文件。 导致内存溢出的.xls
文件是以ASCII模式下载的,而不是Binary。
我将默认值更改为二进制模式,并添加了一个检查,将其更改为.csv
文件的ASCII模式。
我仍然觉得奇怪的是,程序创build了一个2GB的string,因为这一点。 如果在二进制文件中没有换行符,那么我可以看到整个文件如何以一个string结尾。 但是这个文件只有286KB。 所以,这很奇怪。