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。 所以,这很奇怪。