秒杀网实现php
实现秒杀系统的关键要点
秒杀系统的核心在于解决高并发场景下的性能瓶颈和资源竞争问题。以下是一个基于PHP的实现方案:
数据库设计
创建秒杀商品表和订单表,确保表结构包含必要的字段:
CREATE TABLE `seckill_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`stock` int(11) NOT NULL,
`start_time` datetime NOT NULL,
`end_time` datetime NOT NULL,
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` datetime NOT NULL,
PRIMARY KEY (`id`)
);
前端静态化处理
将秒杀页面静态化,减少服务器动态请求压力。使用HTML+CSS+JavaScript构建静态页面,通过AJAX与后端交互:

function seckill(goodsId) {
$.post('/seckill.php', {goods_id: goodsId}, function(result) {
if(result.success) {
alert('秒杀成功');
} else {
alert(result.message);
}
});
}
后端逻辑实现
PHP处理秒杀请求的核心逻辑:
<?php
// 连接Redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 获取参数
$goodsId = $_POST['goods_id'];
$userId = $_SESSION['user_id'];
// 校验重复购买
if($redis->sIsMember('seckill_success:'.$goodsId, $userId)) {
die(json_encode(['success'=>false, 'message'=>'不能重复购买']));
}
// 原子减库存
$stock = $redis->decr('seckill_stock:'.$goodsId);
if($stock < 0) {
$redis->incr('seckill_stock:'.$goodsId); // 恢复库存
die(json_encode(['success'=>false, 'message'=>'商品已售罄']));
}
// 记录成功用户
$redis->sAdd('seckill_success:'.$goodsId, $userId);
// 异步处理订单
$redis->lPush('seckill_order_queue', json_encode([
'user_id' => $userId,
'goods_id' => $goodsId,
'create_time' => time()
]));
echo json_encode(['success'=>true]);
库存预热与缓存
活动开始前将商品库存加载到Redis:

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query("SELECT id, stock FROM seckill_goods");
while($row = $stmt->fetch()) {
$redis->set('seckill_stock:'.$row['id'], $row['stock']);
}
消息队列处理订单
使用单独的PHP进程处理订单队列:
while(true) {
$orderJson = $redis->rPop('seckill_order_queue');
if($orderJson) {
$order = json_decode($orderJson, true);
// 实际订单入库操作
$stmt = $pdo->prepare("INSERT INTO seckill_orders VALUES(null,?,?,?)");
$stmt->execute([
$order['user_id'],
$order['goods_id'],
date('Y-m-d H:i:s', $order['create_time'])
]);
}
usleep(100000); // 100毫秒间隔
}
限流与防刷
实现简单的令牌桶限流算法:
function checkRateLimit($userId) {
$key = 'rate_limit:'.$userId;
$lastTime = $redis->get($key);
$currentTime = time();
if($lastTime && $currentTime - $lastTime < 1) {
return false; // 1秒内只能请求1次
}
$redis->set($key, $currentTime);
return true;
}
系统优化建议
采用分布式架构部署多个秒杀服务节点,通过Nginx负载均衡分散请求压力。使用CDN加速静态资源访问,数据库考虑分库分表方案。对于超高并发场景,可引入更专业的消息队列系统如RabbitMQ或Kafka。






