php app实现秒杀
实现秒杀功能的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`)
);
缓存预热
活动开始前将商品信息加载到Redis,避免直接查询数据库。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->set('seckill_goods_1_stock', 100);
原子性操作
使用Redis的DECR命令保证库存操作的原子性。
$remaining = $redis->decr('seckill_goods_1_stock');
if ($remaining >= 0) {
// 生成订单
$orderId = createOrder($userId, $goodsId);
return ['success' => true, 'order_id' => $orderId];
} else {
$redis->incr('seckill_goods_1_stock'); // 恢复库存
return ['success' => false];
}
限流措施
使用令牌桶算法控制请求速率,防止系统过载。
function isAllowed($userId) {
$key = 'user_limit_' . $userId;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
if ($redis->exists($key)) {
$count = $redis->incr($key);
if ($count > 5) {
return false;
}
} else {
$redis->setex($key, 60, 1);
}
return true;
}
队列异步处理
使用消息队列处理订单创建,减轻数据库压力。
$queue = new Redis();
$queue->connect('127.0.0.1', 6379);
$queue->lPush('seckill_queue', json_encode([
'user_id' => $userId,
'goods_id' => $goodsId
]));
库存同步
定时任务将Redis库存同步到数据库,保持数据一致性。
$cron = new Cron();
$cron->add('* * * * *', function() {
$redis = new Redis();
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stock = $redis->get('seckill_goods_1_stock');
$db->exec("UPDATE seckill_goods SET stock = $stock WHERE id = 1");
});
防刷机制
实现IP限制、用户行为分析等防刷策略。
function checkSecurity($ip, $userId) {
$redis = new Redis();
$key = 'security_check_' . $ip . '_' . $userId;
if ($redis->exists($key)) {
return false;
}
$redis->setex($key, 10, 1);
return true;
}
前端优化
使用倒计时控制按钮状态,避免无效请求。

let countdown = setInterval(() => {
if (remainingTime <= 0) {
clearInterval(countdown);
$('#seckill-btn').prop('disabled', false);
}
}, 1000);
这些方法组合使用可以构建一个稳定的秒杀系统,关键点在于通过缓存减少数据库压力,通过原子操作保证数据一致性,通过限流保护系统稳定性。实际部署时还需要考虑服务器负载均衡、数据库分库分表等架构层面的优化。






