php 实现秒杀
秒杀系统设计要点
高并发秒杀系统的核心在于解决库存超卖、系统崩溃等问题。PHP实现需结合缓存、队列、数据库锁等技术。
使用Redis原子操作控制库存
Redis的原子性操作能有效避免超卖。将库存预热到Redis中,利用DECR或INCRBY进行原子减库存:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 检查库存
$remaining = $redis->get('seckill_stock');
if ($remaining <= 0) {
die('已售罄');
}
// 原子减库存
if ($redis->decr('seckill_stock') >= 0) {
// 生成订单(异步处理)
enqueue_order_queue($user_id, $product_id);
echo '抢购成功';
} else {
$redis->incr('seckill_stock'); // 回滚
echo '库存不足';
}
消息队列异步处理
使用RabbitMQ或Kafka将订单请求异步化,减轻数据库压力:

function enqueue_order_queue($user_id, $product_id) {
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('order_queue', false, true, false, false);
$msg = new AMQPMessage(json_encode([
'user_id' => $user_id,
'product_id' => $product_id,
'time' => time()
]));
$channel->basic_publish($msg, '', 'order_queue');
$channel->close();
$connection->close();
}
数据库最终一致性
消费者处理队列消息时,使用数据库事务确保数据一致:
// 消费者端代码示例
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$db->beginTransaction();
try {
$stmt = $db->prepare("UPDATE products SET stock = stock - 1 WHERE id = ? AND stock > 0");
$stmt->execute([$product_id]);
if ($stmt->rowCount() > 0) {
$order_stmt = $db->prepare("INSERT INTO orders (...) VALUES (...)");
$order_stmt->execute([...]);
$db->commit();
} else {
$db->rollBack();
}
} catch (Exception $e) {
$db->rollBack();
}
限流与防刷
使用令牌桶或漏桶算法控制流量:
// Redis实现简单限流
function is_allowed($user_id, $limit = 5) {
$key = "seckill_limit:$user_id";
$count = $redis->incr($key);
if ($count == 1) {
$redis->expire($key, 60);
}
return $count <= $limit;
}
系统优化建议
前端采用倒计时同步策略,避免客户端时间不准导致提前请求。Nginx层可做请求合并,PHP建议使用Swoole扩展提升并发能力。静态资源与动态接口分离部署,数据库考虑读写分离。






