项目场景:
记录一下使用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的数据->下拉列表的功能,导致内存溢出,把这个下拉列表功能移除就可以正常上传了。
发表评论 取消回复