PHPExcel给我*允许134MB ...尝试16MB,允许内存大小耗尽*甚至2MB excel

时间:2016-10-21 18:33:12

标签: php phpexcel

这是我的代码,当我上传一个超过500kb的文件,在100MB内php_max_memory am得到允许的内存大小耗尽

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;
        }

1 个答案:

答案 0 :(得分:0)

您可能需要对脚本进行概要分析,因为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;
    }