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

发布于 2022-08-29 23:54:15 字数 271 浏览 14 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

鸵鸟症 2022-09-05 23:54:15

感谢各位关注,目前已改用Golang语句重写,15W条CSV记录,下载、解析、去重并导入Mongodb,大概50秒时间。

尛丟丟 2022-09-05 23:54:15

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

以下是老代码

//代码是基于Yii1
set_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...
        }
}

以下是新代码

//代码是基于Yii1
set_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 < $sheetColumnTotal;$i++){
        $name = $activeSheet->getCell('A'.$i)->getValue();
        $phone = $activeSheet->getCell('B'.$i)->getValue();
    }
}
☆獨立☆ 2022-09-05 23:54:15

异步任务队列

笔芯 2022-09-05 23:54:15

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

怀里藏娇 2022-09-05 23:54:15

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

伴我老 2022-09-05 23:54:15

用ajax分批写入吧。php后端一次导入其实不太对的,从流程来看,要经过数据读取、清洗、确认、入库等流程。

爱人如己 2022-09-05 23:54:15

导入excel php原生处理很慢,可以采用PHP扩展xavxls https://git.oschina.net/xavie...
原生读取excel速度和内存都一般都无法接受,你们在网站增加的接口,每个excel2-3W行,服务器就会卡死的,因为内存和CPU不足了。采用其他语言或者PHP的C扩展可以解决读取的问题,剩下的就是插入数据库的问题了。插入数据库可以分批批量插入

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文