php实现订单批量发货
PHP 实现订单批量发货的方法
数据库查询与订单筛选
使用SQL查询获取待发货订单列表,根据状态字段(如status = '待发货')筛选符合条件的订单。建议结合分页查询避免数据量过大导致内存溢出。
$pendingOrders = $db->query("SELECT * FROM orders WHERE status = 'pending_shipment' LIMIT 100");
物流信息批量处理
构建物流API请求参数数组,通常需要订单ID、收货人信息和商品明细。主流物流接口(如顺丰、中通)支持批量操作,需按接口文档组装数据。

$shipmentData = [
['order_id' => 1001, 'tracking_no' => 'SF123456', 'carrier' => '顺丰'],
['order_id' => 1002, 'tracking_no' => 'ZT654321', 'carrier' => '中通']
];
事务处理与状态更新
使用数据库事务确保数据一致性,先标记订单为发货中状态防止重复处理。成功后更新为已发货状态并记录物流单号。

$db->beginTransaction();
try {
$db->exec("UPDATE orders SET status = 'shipped', tracking_no = 'SF123456' WHERE id = 1001");
$db->commit();
} catch (Exception $e) {
$db->rollBack();
}
结果反馈与日志记录
生成批量处理报告,包含成功/失败记录。记录详细日志便于后续排查,建议使用Monolog等日志库。
$logger->info('批量发货结果', [
'success_count' => 20,
'failed_orders' => [1005, 1008]
]);
异常处理机制
针对网络超时、接口限流等情况实现重试机制。设置合理的超时时间(建议30秒),对部分失败的订单进行自动回滚。
$retryTimes = 0;
while ($retryTimes < 3) {
try {
$api->batchShip($shipmentData);
break;
} catch (ApiTimeoutException $e) {
$retryTimes++;
}
}
优化建议
- 使用消息队列异步处理:RabbitMQ或Redis队列缓解高峰时段压力
- 增加进度显示功能:前端通过WebSocket获取实时处理进度
- 实施并发控制:Guzzle的并发请求可提升接口调用效率
- 预校验机制:提前检测地址合规性、库存状态等约束条件
典型错误处理应包括:物流接口返回429状态码时的指数退避重试、数据库死锁的自动解锁机制、订单状态冲突的乐观锁控制。






