产品秒杀php实现
产品秒杀的PHP实现
产品秒杀是高并发场景下的典型应用,需要解决超卖、性能瓶颈等问题。以下是关键实现方案:
数据库设计
创建商品表和订单表,商品表需包含库存字段并设置乐观锁:
CREATE TABLE `seckill_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`stock` int(11) NOT NULL COMMENT '库存',
`version` int(11) NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
PRIMARY KEY (`id`)
);
CREATE TABLE `seckill_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`goods_id` int(11) NOT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
乐观锁实现
通过版本号控制并发更新,避免超卖:

$pdo->beginTransaction();
try {
$sql = "SELECT stock, version FROM seckill_goods WHERE id = ? FOR UPDATE";
$stmt = $pdo->prepare($sql);
$stmt->execute([$goodsId]);
$goods = $stmt->fetch(PDO::FETCH_ASSOC);
if ($goods['stock'] > 0) {
$updateSql = "UPDATE seckill_goods SET stock = stock - 1, version = version + 1
WHERE id = ? AND version = ?";
$affected = $pdo->prepare($updateSql)->execute([$goodsId, $goods['version']]);
if ($affected) {
// 创建订单
$orderSql = "INSERT INTO seckill_orders(user_id, goods_id) VALUES(?, ?)";
$pdo->prepare($orderSql)->execute([$userId, $goodsId]);
$pdo->commit();
return true;
}
}
$pdo->rollBack();
return false;
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
缓存预热
活动开始前将商品信息加载到Redis:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set("seckill:goods:$goodsId:stock", 1000); // 初始化库存
$redis->set("seckill:goods:$goodsId:version", 0); // 初始化版本号
原子计数器
使用Redis的DECR保证原子操作:

$remaining = $redis->decr("seckill:goods:$goodsId:stock");
if ($remaining >= 0) {
// 异步处理订单
$mq->push(['user_id' => $userId, 'goods_id' => $goodsId]);
return ['success' => true];
} else {
$redis->incr("seckill:goods:$goodsId:stock"); // 回滚
return ['error' => '已售罄'];
}
接口限流
使用Redis实现令牌桶限流:
$rateLimitKey = "seckill:limit:$userId";
$now = microtime(true);
$redis->zRemRangeByScore($rateLimitKey, 0, $now - 60); // 清除60秒前的记录
if ($redis->zCard($rateLimitKey) < 10) { // 每分钟10次
$redis->zAdd($rateLimitKey, $now, uniqid());
return true;
}
return false;
异步处理
通过消息队列解耦下单流程:
// 生产者
$mq->push([
'user_id' => $userId,
'goods_id' => $goodsId,
'timestamp' => time()
]);
// 消费者
while ($task = $mq->pop()) {
$orderService->createOrder($task['user_id'], $task['goods_id']);
}
静态化处理
将商品详情页生成静态HTML:
ob_start();
include 'template/goods_detail.php';
$html = ob_get_clean();
file_put_contents("/static/goods_{$goodsId}.html", $html);
注意事项
- 前端需配合倒计时和按钮禁用状态
- 采用Nginx分流不同请求路径
- 实施服务降级方案应对突发流量
- 使用分布式锁处理集群环境
- 做好数据监控和报警机制
该方案结合了数据库乐观锁、Redis原子操作、异步处理等技术,能有效应对高并发场景。实际部署时需根据业务规模调整参数,并进行压力测试。






