(php) PHP批量导入Excel造成网站卡住问题

因用户需要,给网站增加了一项批量导入excel功能,单个excel文件记录大概2万到3万行,20列左右数据,目前测试发现每次导入数据的时候,都会造成网站其他功能短暂卡住无法使用的情况,直至excel全部处理完才可访问。目前每一行记录均通过网站API统一入库(进行一系列的权限、查询、增加、修改、去重、记录日志等操作)。

不知道有什么方法可以改进,使其导入同时不影响其他用户使用,目前想到的办法是将excel解析结果临时保存到xcache,然后分批(30000条/50条=600次)导入。不知是否有更好的办法。

这个问题我也遇到过,不知道楼主遇到的情况是不是和我一样
两个写法都是用的同一个版本的PHPEXCEL,但是不知道为啥第一种会慢很多~

以下是老代码

//代码是基于Yii1
set_time_limit0;//这个一定要
$Excel = CUploadedFile::getInstanceByName"Excel";
$filePath = $Excel->getTempName . . . $Excel->getExtensionName;
$Excel->saveAs$filePath;
Yii::import"application.extensions.*";
$excel = new ExcelReader$filePath;
foreach $excel->getWorksheetList as $worksheet => $value { $rs = $excel->getWorksheetData$worksheet; if !empty$rs { foreach $rs as $index => $row { $name = $row[1]; $phone = $row[2]; //more code... }
}

以下是新代码

//代码是基于Yii1
set_time_limit0;//这个一定要
$Excel = CUploadedFile::getInstanceByName"Excel";
$filePath = $Excel->getTempName . . . $Excel->getExtensionName;
$Excel->saveAs$filePath;
Yii::import"application.extensions.*";
$PHPExcel = new PHPExcel;
$PHPReader = new PHPExcel_Reader_Excel2007;//如果new的是2007,那么excel必须是2007格式的
$excel = $PHPReader->load$filePath;//引入文件
$excelSheets = $excel->getAllSheets;
$activeSheetNames = $excel->getSheetNames;
foreach $excelSheets as $SheetIndex => $activeSheet { $sheetColumnTotal = $activeSheet->getHighestRow; if$sheetColumnTotal == 0{ continue; } for$i = 2;$i < $sheetColumnTotal;$i++{ $name = $activeSheet->getCellA.$i->getValue; $phone = $activeSheet->getCellB.$i->getValue; }
}

异步任务队列

上传后生成任务记录,放到队列处理

如果需要处理的数据太多,建议写入一个队列,然后使用后台php—cli队列任务处理进程来异步处理吧。这个有点像我之前做的一个视频上传后加入队列,然后使用后台PHP—cli进程来异步处理视频转码过程的例子。

发表评论

电子邮件地址不会被公开。 必填项已用*标注