PHP调用PUT接口提交JSON遇单次20SKU限制如何提交千余SKU
问题根因
服务端接口做了硬校验,单次PUT请求最多接收20条SKU数据,直接把1000+条全量数据一次性传过去必然触发20 SKU limit per submission报错,所有客户端侧改请求头、改传参格式的尝试都绕不过服务端的计数校验。
可行实现方案
按接口限制把全量SKU拆成每批最多20条,循环分批提交即可,实现步骤如下:
- 读取本地ti.json文件,将JSON内容解析为PHP数组
- 用
array_chunk函数把SKU列表按每20条切分为多个独立批次 - 初始化cURL句柄(不要在循环内重复初始化,提升性能)
- 循环遍历每个批次,将当前批次的SKU组装成接口要求的
{"data": []}结构,转为JSON后作为请求体发起请求 - 每批请求间隔加百毫秒级的停顿,避免触发接口频率限制,同时记录每批的响应结果,方便定位失败条目
可直接运行的代码示例
<?php // 读取并解析本地SKU文件 $rawContent = file_get_contents('ti.json'); $skuData = json_decode($rawContent, true); if (!isset($skuData['data']) || empty($skuData['data'])) { die("ti.json文件内容读取失败或无有效SKU数据"); } // 按每批20条拆分SKU,可根据实际情况调小批次大小 $skuBatches = array_chunk($skuData['data'], 20); // 初始化cURL,公共配置只设置一次 $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => '/products/updateSkus', // 替换为你的实际接口地址 CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 10, // 建议设置合理超时时间,不要设为0无限等待 CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'PUT', CURLOPT_HTTPHEADER => array( 'Authorization: Bearer xxx', // 替换为你的实际鉴权token 'Content-Type: application/json' ), )); $successCount = 0; $failList = []; foreach ($skuBatches as $index => $batch) { // 组装当前批次的请求体 $requestBody = json_encode(['data' => $batch], JSON_UNESCAPED_UNICODE); curl_setopt($curl, CURLOPT_POSTFIELDS, $requestBody); $response = curl_exec($curl); $err = curl_error($curl); if ($err) { $failList[] = [ 'batch' => $index + 1, 'skus' => array_column($batch, 'sku'), 'error' => $err ]; } else { // 可根据接口实际返回的成功标识判断是否真的提交成功,这里示例直接记录 $successCount += count($batch); echo "第".($index + 1)."批提交完成,响应:".$response.PHP_EOL; } // 每批间隔0.2秒,避免请求过快被限流 usleep(200000); } curl_close($curl); echo "全部批次处理完成,成功提交{$successCount}条SKU".PHP_EOL; if (!empty($failList)) { echo "失败批次:".print_r($failList, true); }
注意事项
- 不要尝试通过修改请求头、拆分JSON结构等方式绕过20条的限制,该限制是服务端对请求体内SKU数量做的硬计数,客户端侧的投机操作都不会生效
- 如果接口稳定性一般,可以把每批的数量从20调低到10-15,降低单批请求失败的概率
- 一定要记录失败的批次和对应SKU,避免部分SKU漏更新
- 原代码里
CURLOPT_TIMEOUT设为0是不合理的,会导致请求卡住时程序无限挂起,建议设置5-10秒的合理超时时间
内容的提问来源于stack exchange,提问作者Phan Vũ
相关产品推荐
相关产品推荐

