附加信息:
我是从命令行运行的。 CentOS 6,32GB Ram总计,2GB内存用于PHP。
我尝试将内存限制增加到4GB,但现在我得到Fatal error: String size overflow
。 PHP maximum string size is 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;
}
答案 0 :(得分:0)
我解决了这个问题。事实证明它与php代码有些无关。
我正在编写的程序从电子邮件和FTP下载.xls
,.xlsx
和.csv
个文件。导致内存溢出的.xls
文件以ASCII模式而不是Binary下载。
我将默认设置更改为二进制模式,并添加了一项检查,将其更改为.csv
文件的ASCII模式。
我仍然觉得奇怪的是该程序因此创建了一个2GB的字符串。如果二进制文件中没有换行符,那么我可以看到整个文件可能最终会在一个字符串中结束。但该文件只有286KB。所以,这很奇怪。