PHPExcel抛出致命错误:允许的内存大小为134217728字节耗尽(试图分配71个字节)

时间:2014-02-19 20:06:43

标签: php phpexcel

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

  

致命错误:允许的内存大小为134217728字节耗尽(尝试过   分配71个字节)   第89行/home/sample/PHPExcelReader/Classes/PHPExcel/worksheet.php

我的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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

此错误表示您运行的PHP文件已超出服务器上PHP允许的内存大小。您可以编辑PHP.ini文件以允许PHP文件在运行时在内存中分配更多空间,这可能有助于此,但同时,如果您在服务器上运行32位Linux操作系统,无论如何原因是,该过程可能占用3.5GB的硬披风,因此即使分配更多,它仍然会失败,因此会导致类似的问题。

在这种情况下,它实际上归结为这样一个事实,即您尝试提取的数据量太大而您需要以某种方式缩小它。它不一定是代码的问题,而是您实际尝试显示/处理的数据量。

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

信息: http://ca1.php.net/manual/en/ini.core.php#ini.memory-limit