Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取286KB文件时耗尽2GB的PHP Excel内存限制_Php_Excel_Memory Leaks - Fatal编程技术网

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

读取286KB文件时耗尽2GB的PHP Excel内存限制,php,excel,memory-leaks,Php,Excel,Memory Leaks,附加信息: 我正在从命令行运行这个。CentOS 6,总内存32GB,PHP内存2GB。 我尝试将内存限制增加到4GB,但现在我遇到了一个致命错误:字符串大小溢出 我的代码是非常简单的测试代码: $Reader = new SpreadsheetReader($_path_to_files . 'ABC.xls'); $i = 0; foreach ($Reader as $Row) { $i++; print_r($Row); if($i>10) break; } 只需打

附加信息: 我正在从命令行运行这个。CentOS 6,总内存32GB,PHP内存2GB。 我尝试将内存限制增加到4GB,但现在我遇到了一个
致命错误:字符串大小溢出

我的代码是非常简单的测试代码:

$Reader = new SpreadsheetReader($_path_to_files . 'ABC.xls');
$i = 0;
foreach ($Reader as $Row)
{   $i++;
    print_r($Row);
if($i>10) break;

}
只需打印10行。这就占用了2G的内存

错误发生在excel_reader2.php的第253行

类内
OLERead
,函数内
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;

    }
if($this->numExtensionBlocks!=0){
$bbdBlocks=(大街区大小-大街区仓库街区位置)/4;
}
对于($i=0;$i<$bbdBlocks;$i++){//第253行
$bigBlockDepotBlocks[$i]=GetInt4d($this->data,$pos);
$pos+=4;
}

我解决了这个问题。结果证明它与php代码有些不相关

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

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


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

除了你没有使用PHPExcel之外,为什么你的问题被标记为
PHPExcel
?我错误地认为这是使用PHPExcel的。它实际上使用了php excel阅读器:“XLS文件解析是用php excel阅读器完成的”。很抱歉。@MarkBaker感谢您的编辑和评论。我设法解决了我的问题,但仍然想知道2GB的内存是如何在处理一个287KB的文件时被耗尽的。xls文件作为一个二进制字符串加载到内存中,然后解析成块和子块(流和子流),每个块和子块都同时存在于内存中,然后再分析子流所包含的实际值;同时,从内容构建的数组也在内存中。。。。虽然我不希望该文件占用2GB的内存,但我可以很容易地相信,仅仅解析就需要20MB或更多的内存,而正在构建的阵列则需要更多的内存