PHPExcel 给了我*允许的 134MB ...尝试了 16MB,允许的内存大小耗尽*即使是 2MB excel

PHPExcel gives me *Allowed 134MB ... Tried 16MB, Allowed memory size exhausted* even on 2MB excel

这是我的代码,当我上传超过 500kb 的 100MB 文件时 php_max_memory 允许的内存大小耗尽

public function runImport($file){   
         $errors = array();
                $objPHPExcel = Config::getExcel($file);
                foreach($objPHPExcel->getSheet(0)
                                    ->getRowIterator(2, $objPHPExcel->
                                                        getSheet(0)->
                                                        getHighestDataRow()) as $row ){
                    $i = 0;
                    $_data = array();
                    foreach($row->getCellIterator() as $cell ){
                        $i++;
                        if ($i > count($columns)) break;
                        array_push($_data,(string)$cell->getValue());
                    }
                    foreach ($_data as $item){
                        if ($item != null && $item != "" && strlen($item) > 0){
                            $jdata = new Jobsdata();
                            $jdata->jobId = $this->jobId;
                            $jdata->data = $_data;
                            $jdata->save();
                            break;
                        }
                    }
                }
                $this->save();
                return $errors;
        }

您可能需要分析您的脚本,因为 PHPexcel 在内存使用方面往往有点自由,但与此同时,如果您时间紧迫,可以尝试垃圾在循环中使用 gc_collect_cycles() 进行收集,因为 PHP 在函数或脚本完成之前不会进行垃圾收集。它会减慢它的速度,但它可能会完成。

public function runImport($file){   
     $errors = array();
            $objPHPExcel = Config::getExcel($file);
            foreach($objPHPExcel->getSheet(0)->getRowIterator(2, $objPHPExcel->getSheet(0)->getHighestDataRow()) as $row ){
                $i = 0;
                $_data = array();
                foreach($row->getCellIterator() as $cell ){
                    $i++;
                    if ($i > count($columns)) break;
                    array_push($_data,(string)$cell->getValue());
                    gc_collect_cycles();
                }
                foreach ($_data as $item){
                    if ($item != null && $item != "" && strlen($item) > 0){
                        $jdata = new Jobsdata();
                        $jdata->jobId = $this->jobId;
                        $jdata->data = $_data;
                        $jdata->save();
                        break;
                    }
                    gc_collect_cycles();
                }
                gc_collect_cycles();
            }
            $this->save();
            return $errors;
    }