当前位置: 首页 > 知识库问答 >
问题:

PHPExcel抛出致命错误:允许的内存大小134217728字节已用尽(尝试分配71字节)

戚云
2023-03-14

我正在使用PHPExcel(在这里找到:https://github.com/PHPOffice/PHPExcel)。如果我尝试读取超过大约2000行,然后它显示内存错误如下。

致命错误:第89行的/home/sample/PHPExcelReader/Classes/PHPExcel/sheetwork.php中允许的134217728字节内存已耗尽(尝试分配71字节)

我的Excel数据范围是A1:X2000

下面是我用来读取excel的代码。

ini_set('memory_limit', '-1');
/** Include path **/
        set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');


    /** PHPExcel_IOFactory */
    include $unsecured_param['home_dir'].'APIs/PHPExcelReader/Classes/PHPExcel/IOFactory.php';
    $inputFileName = $target;  // File to read
    //echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory to identify the format<br />';
    try {
        $objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
    } catch(Exception $e) {
        die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
    }

    $sheetData = $objPHPExcel->getActiveSheet()->rangeToArray('A1:X2000', null, true, true, true)
    //store data into array..
    $i=0;$j=0;$max_rows=0;$max_columns=0;
    foreach($sheetData as $rec)
    {
        foreach($rec as $part)
        {//echo "items[$j][$i]=" ; echo $part;echo "<br>";
            $items[$j][$i]=$part; $i=$i+1;
            if($j==0) {$max_columns=$i;}
        }
        $j=$j+1;$i=0;
    }
    $max_rows=$j;

有人能告诉我如何克服这个问题吗?

共有2个答案

满勇军
2023-03-14

此错误表示您正在运行的PHP文件超出了服务器上PHP允许的内存大小。您可以编辑PHP.ini文件,以允许PHP文件在运行时在内存中分配更多空间,这可能有助于做到这一点,但同时,如果出于任何原因在服务器上运行32位Linux操作html" target="_blank">系统,进程可能会占用3.5GB的硬容量,因此即使分配的空间比这还要多,它仍然会失败,因此会导致类似的问题。

在这种情况下,实际上是因为您试图提取的数据量太大,需要以某种方式将其缩小。这不一定是代码的问题,而是实际要显示/处理多少数据。

使用谷歌,我设法发现你的记录(134217728字节)的内存量与PHP. ini用于memory_limit的128MB默认值相匹配。本机更改ini中的值将解决此问题。如果无法做到这一点,那么您需要以某种方式限制一次拉入的数据量。

资料:http://ca1.php.net/manual/en/ini.core.php#ini.memory-极限

谷梁嘉运
2023-03-14

考虑使用单元格缓存来减少在内存中保存工作簿所需的内存,如开发人员文档的4.2.1节中所述。

考虑不要使用toArray(),然后使用它在内存中构建另一个数组......这样做实际上是使用大量内存来保存重复的数据,而你可以简单地循环工作表的行和列来做你需要的事情

 类似资料: