Laravel导入大JSON文件至MySQL遇超时问题求助
解决JSON数据导入MySQL超时及分块导入方案
一、彻底解决执行超时问题
修改php.ini后仍超时,大概率是配置未生效或遗漏了其他超时设置,按以下步骤排查:
- 确认修改的是正确的php.ini文件:在PHP脚本中输出
phpinfo(),查看Loaded Configuration File对应的路径,确保修改的是该文件(XAMPP可能存在Apache和CLI两个版本的php.ini)。 - 修改后必须重启Apache服务:XAMPP控制面板中重启Apache,否则配置不会生效。
- 脚本内强制设置超时:在导入脚本开头添加
set_time_limit(0);(0表示取消时间限制);如果用PDO连接数据库,额外设置PDO::ATTR_TIMEOUT为0;用mysqli则添加mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 0);。 - 检查MySQL端超时:修改XAMPP中MySQL的
my.ini(Windows)或my.cnf(Linux),调整wait_timeout和interactive_timeout为更大值(比如300),修改后重启MySQL服务。
二、分块导入数据(更稳妥的大文件处理方案)
一次性导入大文件容易触发超时,分块处理能降低内存占用和超时风险,以PHP为例:
- 数组分块批量插入:如果JSON是数组格式,先解码成数组再分块插入
// 读取并解析JSON文件 $jsonContent = file_get_contents('your_data.json'); $dataArray = json_decode($jsonContent, true); // 按每1000条数据分块(可根据服务器性能调整) $chunks = array_chunk($dataArray, 1000); // 连接数据库 $conn = mysqli_connect('localhost', 'username', 'password', 'database_name'); foreach ($chunks as $chunk) { $valueStrings = []; foreach ($chunk as $item) { // 转义字段值防止SQL注入 $field1 = mysqli_real_escape_string($conn, $item['field1']); $field2 = mysqli_real_escape_string($conn, $item['field2']); $valueStrings[] = "('$field1', '$field2')"; } // 批量插入SQL $sql = "INSERT INTO target_table (field1, field2) VALUES " . implode(',', $valueStrings); mysqli_query($conn, $sql); } mysqli_close($conn);
- 流式解析超大JSON:如果JSON文件大到无法一次性加载到内存,可使用JSON流式解析库(如JSON Streaming Parser)逐行读取解析,每解析一定数量的数据就执行一次插入。
- 用MySQL原生工具导入:将JSON转换为CSV格式,使用
LOAD DATA INFILE命令导入,速度远快于PHP脚本插入,且不易超时:
LOAD DATA INFILE 'converted_data.csv' INTO TABLE target_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (field1, field2);
内容的提问来源于stack exchange,提问作者rjcode
相关产品推荐
相关产品推荐

