项目场景:

记录一下使用thinkphp开发excel导入功能时碰到的一个小BUG


问题描述

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 83886080 bytes) in /www/server/test/vendor/phpoffice/phpexcel/Classes/PHPExcel/CachedObjectStorage/Memory.php on line 49


原因分析:

先看代码:
需要引入phpoffice/phpexcel

composer require phpoffice/phpexcel
<?php
public class ExcelImportController{
	public function excelImportTest(){
		ini_set('max_execution_time', 600);//600s
    	ini_set("memory_limit","1024M");//内存限制1024M
    	$result = array('code'=>0, 'msg'=>'操作失败');
        $file = request()->file('file');
        $type = input('type');
        $file_name = $file->getInfo()['name'];//文件名称
        $file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
        $file_path = 'uploads/files/';
        $info = $file->move($file_path);
        if($info){
            $new_path = $file_path.$info->getSaveName();
            $objPHPExcel = new \PHPExcel();
            //实例化PHPExcel类
            if ($file_extension == 'xlsx'){
                $objReader=new \PHPExcel_Reader_Excel2007();
            } else if ($file_extension == 'xls') {
                $objReader = new \PHPExcel_Writer_Excel5($objPHPExcel);
            } else{
                $objReader = new \PHPExcel_Writer_Excel5($objPHPExcel);
            }
            $objPHPExcel = $objReader->load($new_path,'utf-8');
            $sheet = $objPHPExcel->getSheet(0);
            $highestRow = $sheet->getHighestRow(); //取得总行数
            for($i=2;$i<=$highestRow;$i++)
            {
                $data[$a]['name'] = $objPHPExcel->getActiveSheet()->getCell("A".$i)->getValue();
                if($data[$a]['name'] == ''){
                    break;
                }
                $data[$a]['avatar'] = $objPHPExcel->getActiveSheet()->getCell("B".$i)->getValue();
                $data[$a]['nickname'] = $objPHPExcel->getActiveSheet()->getCell("C".$i)->getValue();
                $gender = $objPHPExcel->getActiveSheet()->getCell("C".$i)->getValue();
                $data[$a]['gender'] = $gender == '男'?1:0;
                $a++;
            }
            //insertAll
            if(!empty($data)){
                $res = (new TestModel())->insertAll($data);
                if($res){
                    $result['importCount'] = $a;
                }
            }else{
                $result['importCount'] = 0;
            }
            $result['code'] = 1;
            $result['msg'] = 'success';
            return json_encode($result);
          }else{
          	return json_encode($result);
          }
	}
}

报错提示说是内存超过设定值,刚开始我以为是我传的文件太大了,后面我删掉了excel的所有数据,只留了一行,结果依然报错。
但是同事用这个接口测试一点问题没有,可以正常导入数据,然后我就把他的excel拿过来了试了一下,果然正常了,至此,真相大白,是我的excel文件有问题。


解决方案:

然后我对比了一下两个的文件,我的文件里其中一列用到了一个wps的数据->下拉列表的功能,导致内存溢出,把这个下拉列表功能移除就可以正常上传了。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部