PHP Excel内存限制为2GB,读取286KB文件时已耗尽


PHP Excel Memory Limit of 2GB Exhausted reading a 286KB file

添加信息:我从命令行运行这个。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。所以,这很奇怪。