
本文详细讲解如何通过php将包含1000+ sku的json文件拆分为符合api限制(如20 sku/次)的多个批次,使用curl安全、可靠地完成批量put更新。
本文详细讲解如何通过php将包含1000+ sku的json文件拆分为符合api限制(如20 sku/次)的多个批次,使用curl安全、可靠地完成批量put更新。
在调用第三方或自建RESTful API时,常遇到“单次请求SKU数量上限”(如20条)的硬性限制。直接发送含1000+ SKU的完整JSON会导致400错误或被拒绝。正确做法不是绕过限制,而是主动分片(chunking)+ 批量循环提交。以下是经过生产验证的完整解决方案:
✅ 步骤一:解析并分块原始JSON数据
首先读取 ti.json,提取 data 数组,并按每20条SKU切分成多个子数组:
<?php $jsonContent = file_get_contents('ti.json');
$data = json_decode($jsonContent, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die("JSON解析失败: " . json_last_error_msg());
}
$skuData = $data['data'] ?? [];
$chunkSize = 20; // 严格遵循API文档的单次上限
$chunks = array_chunk($skuData, $chunkSize);✅ 步骤二:封装安全的PUT请求函数
为避免重复代码和提升可维护性,封装一个带错误处理与延迟控制的PUT函数:
function sendPutRequest($url, $payload, $token) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => json_encode(['data' => $payload], JSON_UNESCAPED_UNICODE),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
'Accept: application/json'
],
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false, // 生产环境请启用证书验证
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$error = curl_error($curl);
curl_close($curl);
if ($httpCode >= 400) {
error_log("PUT失败 [HTTP {$httpCode}]: " . substr($response, 0, 200));
throw new Exception("API响应异常: HTTP {$httpCode}");
}
return json_decode($response, true);
}✅ 步骤三:循环提交每个数据块,并添加容错机制
关键点:加入重试逻辑、请求间隔(防限流)、进度反馈:
$apiEndpoint = 'https://api.example.com/products/updateSkus'; // 替换为实际URL
$accessToken = 'xxx'; // 替换为真实Token
echo "共需提交 " . count($chunks) . " 批次(每批最多{$chunkSize} SKU)\n";
foreach ($chunks as $index => $chunk) {
try {
echo "▶ 正在提交第 " . ($index + 1) . "/" . count($chunks) . " 批(" . count($chunk) . " 条SKU)...\n";
$result = sendPutRequest($apiEndpoint, $chunk, $accessToken);
echo "✅ 第 " . ($index + 1) . " 批成功\n";
// 建议添加100–500ms延迟,避免触发服务端速率限制
usleep(300000); // 0.3秒
} catch (Exception $e) {
echo "❌ 第 " . ($index + 1) . " 批失败: " . $e->getMessage() . "\n";
// 可选:记录失败chunk到单独文件用于后续重试
file_put_contents("failed_chunk_{$index}.json", json_encode($chunk, JSON_PRETTY_PRINT));
continue;
}
}
echo "\n✅ 全部SKU更新任务已完成。\n";⚠️ 重要注意事项
- 不要忽略API文档:确认/products/updateSkus是否要求顶层键为data(本例假设结构匹配),否则需调整json_encode(['data' => $payload])中的键名;
- Token有效期:若执行时间较长(>1小时),需考虑Token刷新机制;
- 幂等性设计:确保API支持重复提交(如SKU更新是覆盖而非累加),否则需引入唯一请求ID或版本号;
- 日志与监控:生产环境务必记录每次请求的request_id、耗时、响应体摘要;
- 内存优化:处理超大JSON(如10MB+)时,建议改用json streaming parser(如JsonStreamingParser)替代json_decode()。
通过以上分块+重试+节流策略,你不仅能稳定提交1000+ SKU,还能轻松扩展至万级规模——核心不是“一次发完”,而是“聪明地分多次发好”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











