You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为例:

  1. 数组分块批量插入:如果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);
  1. 流式解析超大JSON:如果JSON文件大到无法一次性加载到内存,可使用JSON流式解析库(如JSON Streaming Parser)逐行读取解析,每解析一定数量的数据就执行一次插入。
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:55:54