通过AJAX发送大型对象数组至PHP时的异常问题排查
看起来你遇到的核心问题是免费主机的PHP配置限制——本地XAMPP默认配置比较宽松,但000webhost的免费方案为了控制服务器资源,会对POST数据的大小、输入变量数量做严格限制,甚至可能强制覆盖用户通过.htaccess设置的参数。下面给你几个可行的解决思路:
1. 先确认主机的实际PHP配置
首先得搞清楚000webhost的PHP参数是不是真的生效了——免费主机经常会忽略用户的.htaccess配置。你可以在saveStories.php里加一段代码:
<?php phpinfo(); ?>
访问这个文件,找到post_max_size、max_input_vars、upload_max_filesize这几个参数,看看实际值是不是你设置的20M和100000。如果没变化,说明主机不允许通过.htaccess修改这些参数,得换其他方式。
2. 分批次发送数组
既然小批量数据能正常提交,最稳妥的办法就是把大数组切成小块分批发送。比如每次发100个对象,用Promise来处理批量请求,确保所有数据都能提交成功:
前端JS代码:
// 先排序数组 const storiesToSave = Stories.sort((a,b) => new Date(a.date) - new Date(b.date)); // 定义每批次发送的数量 const batchSize = 100; const batches = []; // 分割数组成多个批次 for (let i = 0; i < storiesToSave.length; i += batchSize) { batches.push(storiesToSave.slice(i, i + batchSize)); } // 批量发送请求,用Promise.all确保所有批次完成 Promise.all(batches.map(batch => { return $.ajax({ type: 'POST', url: "saveStories.php", data: {"stories": JSON.stringify(batch)}, dataType: 'json' }); })).then(allResults => { alert('所有故事都保存成功啦!'); }).catch(error => { alert(`保存出错:${error.message}`); });
后端PHP代码调整:
你需要修改saveStories.php,让它能处理分批的数据——比如如果是存数据库就用批量插入,存文件就追加内容:
<?php if (!empty($_POST['stories'])) { $stories = json_decode($_POST['stories'], true); // 这里写你的保存逻辑,示例:批量插入数据库 // $stmt = $pdo->prepare("INSERT INTO stories (date, content) VALUES (?, ?)"); // foreach ($stories as $story) { // $stmt->execute([$story['date'], $story['content']]); // } echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'error', 'msg' => '无有效数据提交']); } ?>
3. 修正JSON Content-Type的使用方式
你之前尝试的第二种方案(设置contentType: "application/json")本地失效,是因为PHP不会自动把JSON格式的POST数据解析到$_POST里,需要手动读取php://input。如果想用这个方案,后端代码要改成:
<?php $jsonData = file_get_contents('php://input'); $data = json_decode($jsonData, true); if (!empty($data['stories'])) { $stories = $data['stories']; // 执行保存逻辑... echo '保存成功'; } ?>
不过这个方案还是绕不开主机的POST大小限制,所以结合分批次发送效果更好。
4. 联系主机客服调整配置
如果分批发送对你的业务逻辑不太友好,可以试试联系000webhost的客服,问问能不能免费调高max_input_vars和post_max_size的限制——虽然免费主机可能性不大,但值得一试。
内容的提问来源于stack exchange,提问作者user2909100

