1

附加信息:我正在从命令行运行它。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;

    }
4

1 回答 1

0

我解决了这个问题。事实证明,它与 php 代码有些无关。

我正在编写的程序从电子邮件和 FTP下载.xls、、.xlsx和文件。.csv导致内存溢出的.xls文件是以 ASCII 模式而不是二进制模式下载的。

我将默认值更改为二进制模式,并添加了一个检查,将其更改为.csv文件的 ASCII 模式。

我仍然觉得奇怪的是,程序因此创建了一个 2GB 的字符串。如果二进制文件中没有换行符,那么我可能会看到整个文件如何以一个字符串结尾。但是文件只有286KB。所以,这很奇怪。

于 2013-09-01T03:48:22.447 回答