添加信息:我从命令行运行这个。CentOS 6,32GB内存,2GB内存用于PHP。我试着将内存限制增加到4GB,但现在我得到了Fatal error: String size overflow
。PHP最大字符串大小为2GB。
我的代码是非常简单的测试代码:
$Reader = new SpreadsheetReader($_path_to_files . 'ABC.xls');
$i = 0;
foreach ($Reader as $Row)
{ $i++;
print_r($Row);
if($i>10) break;
}
而且只打印10行。这需要2 GB的内存?
错误发生在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;
}
我解决了这个问题。事实证明,它与php代码有些无关。
我正在编写的程序从电子邮件和FTP下载.xls
、.xlsx
和.csv
文件。导致内存溢出的.xls
文件是以ASCII模式而不是二进制模式下载的。
我将默认设置更改为二进制模式,并添加了一个检查,将.csv
文件的默认设置更改成ASCII模式。
我仍然觉得很奇怪,因为这个程序创建了一个2GB的字符串。如果二进制文件中没有换行符,那么我也许可以看到整个文件最终会变成一个字符串。但该文件只有286KB。所以,这很奇怪。