如何用单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
相关产品推荐
相关产品推荐

