• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 3年前 (2022-01-25) 118次浏览 已收录 0个评论
文章目录[隐藏]

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

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

~来1源gaodai#ma#com搞*代#码1网搞代gaodaima码

回复内容:

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

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

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

以下是老代码

<code>//代码是基于Yii1set_time_limit(0);//这个一定要$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...        }}</code>

以下是新代码

<code>//代码是基于Yii1set_time_limit(0);//这个一定要$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 getCell('A'.$i)->getValue();        $phone = $activeSheet->getCell('B'.$i)->getValue();    }}</code>

异步任务队列

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP批量导入Excel造成网站卡住问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址