0

0

php实现班级通信录导入内存溢出_php优化内存导入法【方案】

星夢妙者

星夢妙者

发布时间:2026-01-26 13:55:11

|

244人浏览过

|

来源于php中文网

原创

PHP导入大Excel班级通信录内存溢出的直接原因是fgetcsv或PhpSpreadsheet默认全量加载数据到内存;应启用setReadDataOnly(true)、流式RowIterator逐行处理,或改用Spout库实现恒定低内存占用。

php实现班级通信录导入内存溢出_php优化内存导入法【方案】

PHP导入大Excel班级通信录时内存溢出的直接原因 memory_limit 被突破不是偶然,而是 fgetcsvPHPExcelPhpSpreadsheet 默认加载整张表到内存所致。尤其当班级通信录含 5000+ 行、多列(姓名、电话、家长微信、地址、入学时间等),用 load()getActiveSheet()->toArray() 会一次性把全部单元格转成 PHP 数组——每个字符串在 Zend 引擎里至少占 48 字节以上,1 万行 × 10 列 × 60 字节 ≈ 6MB 只是基础,实际常飙到 200MB+。

常见错误现象包括:Fatal error: Allowed memory size of XXX bytes exhausted,或导入中途 php-fpm worker 被 kill。

可赞AI
可赞AI

文字一秒可视化,免费AI办公神器

下载

用 PhpSpreadsheet 的 setReadDataOnly(true) + setLoadSheetsOnly() 降载 只读数据、跳过样式/公式/宏,能砍掉 60%~80% 内存占用
  • $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
  • $reader->setReadDataOnly(true); —— 忽略字体、边框、条件格式
  • $reader->setLoadSheetsOnly(['Sheet1']); —— 避免多 Sheet 全部加载
  • 再用 $spreadsheet = $reader->load($filePath);,此时内存压力明显下降
注意:若通信录含日期列,setReadDataOnly(true) 会让日期变成 Excel 序列号(如 44562),需手动调用 \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject() 转换,别依赖自动类型推断。

真正治本:流式逐行读取(RowIterator) 不把整张表 load 进内存,而是边读边处理:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load($filePath);
$worksheet = $spreadsheet->getActiveSheet();

foreach ($worksheet->getRowIterator() as $row) {
    $cellIterator = $row->getCellIterator();
    $cellIterator->setIterateOnlyExistingCells(false); // 确保空列也读到
    $rowData = [];
    foreach ($cellIterator as $cell) {
        $rowData[] = $cell->getValue();
    }
    // ✅ 此处立即校验、入库、或写入临时文件,不累积数组
    processStudentRecord($rowData);
}
关键点:
  • 每次循环只持有一个 $row 和若干 $cell 对象,内存恒定在 ~200KB 内
  • 避免使用 $worksheet->toArray()rangeToArray()
  • 若需跳过表头,用 if ($row->getRowIndex() === 1) continue;

超大文件(>10MB)建议改用 spout 替代 PhpSpreadsheet spout 是纯流式库,无 DOM、无样式、无公式,专为大数据导入设计,内存稳定在 3–5MB:
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;

$reader = ReaderEntityFactory::createReaderFromFile($filePath);
$reader->open($filePath);

foreach ($reader->getSheetIterator() as $sheet) {
    foreach ($sheet->getRowIterator() as $row) {
        $rowData = $row->getCells();
        processStudentRecord($rowData); // 同上
    }
}
$reader->close();
兼容性注意:
  • 仅支持 .xlsx.ods.csv,不支持 .xls(Excel 97-2003)
  • 不解析日期/数字格式,所有值都是字符串,需自行 strtotime()(int) 转换
  • 无法读取合并单元格内容(班级通信录一般不用合并,影响小)
真正容易被忽略的是:即使用了流式读取,如果在循环里不断 array_push($allRecords, $rowData) 积累全部数据,内存照样爆。必须“读一行、验一行、存一行”,中间不留痕。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

775

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

296

2023.10.25

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

256

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

623

2023.11.24

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

22

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号