You need to enable JavaScript to run this app. 如何用单PHP脚本分批次上传XML内1000个商品(单次限100个)
优惠活动
大模型
产品
解决方案
定价
更多

如何用单PHP脚本分批次上传XML内1000个商品(单次限100个)

全量XML自动分批上传优化方案

核心调整逻辑

  • 仅加载1次全量商品XML文件,无需手动拆分文件、逐个运行脚本
  • 固定每批次上传100条数据,自动按偏移量切片循环调用接口
  • 新增批次执行日志,可清晰定位每一批次的上传结果
  • 完全兼容原有接口的认证、请求格式,无需修改对接规则

改造后完整代码

<?php
// 基础配置
$fullXmlPath = "products_full.xml"; // 替换为实际的全量商品XML路径
$batchSize = 100; // 服务端限制的单批次最大商品数
$apiUrl = 'https://.../api/product/save'; // 替换为实际的接口地址
$username = '...'; // 替换为实际的认证用户名
$password = '...'; // 替换为实际的认证密码

// 解析全量XML为商品数组
$data = [];
$xml = simplexml_load_file($fullXmlPath) or die("Error: Cannot create object");
foreach ($xml->product as $pr) {
  $data[] = [
    "id" => (int)$pr->identifier,
    "name" => (string)$pr->name,
    // 保留原有其他字段的解析逻辑
  ];
}

$totalCount = count($data);
echo "共解析到 {$totalCount} 条商品数据,开始分批上传...<hr>";

// 生成认证头(仅计算1次,所有批次共用)
$authHash = base64_encode($username . ':' . $password);
$requestHeaders = [
   'Authorization: Basic ' . $authHash
];

// 循环分批次上传
for ($offset = 0; $offset < $totalCount; $offset += $batchSize) {
  $batchNo = intval($offset / $batchSize) + 1;
  $batchData = array_slice($data, $offset, $batchSize);
  $currentBatchCount = count($batchData);
  echo "<p>正在上传第 {$batchNo} 批,共 {$currentBatchCount} 条商品...</p>";

  // 初始化curl请求
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $apiUrl);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
  curl_setopt($ch, CURLOPT_HTTPHEADER, $requestHeaders);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['data' => $batchData]));

  $response = curl_exec($ch);
  $curlError = curl_error($ch);
  curl_close($ch);

  // 输出当前批次执行结果
  if ($curlError) {
    echo "<p style='color:red'>第 {$batchNo} 批请求失败:{$curlError}</p><hr>";
    continue;
  }
  $responseData = json_decode($response, true);
  echo '<pre>第 ' . $batchNo . ' 批接口返回:';
  print_r($responseData);
  echo '</pre><hr>';

  // *若接口有频率限制要求,可在此处添加 sleep(1) 控制请求间隔
}
echo "全量商品上传流程执行完毕。";
?>

注意事项

  • 无需手动拆分XML文件,直接将全量商品文件的路径替换代码中$fullXmlPath的配置即可
  • 认证信息、接口地址仅需配置1次,所有批次共用相同的请求规则
  • 如果服务端对请求频率有限制,可在单批次上传完成后添加延时逻辑,避免触发接口限流
  • 代码完全保留原有XML解析、参数组装的逻辑,不会影响原有对接的字段映射规则

内容的提问来源于stack exchange,提问作者Denis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 03:36:06