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

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ũ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:42:18