php实现抽奖
PHP实现抽奖功能
抽奖功能的核心在于随机性和概率控制,以下是几种常见的实现方式:
基础随机抽奖
$prizes = ['一等奖', '二等奖', '三等奖', '谢谢参与'];
$winner = $prizes[array_rand($prizes)];
加权概率抽奖

function weightedDraw($prizes) {
$total = array_sum(array_column($prizes, 'probability'));
$rand = mt_rand(1, $total);
$current = 0;
foreach ($prizes as $prize) {
$current += $prize['probability'];
if ($rand <= $current) {
return $prize['name'];
}
}
}
$prizes = [
['name' => 'iPhone', 'probability' => 1],
['name' => '耳机', 'probability' => 10],
['name' => '优惠券', 'probability' => 100],
['name' => '谢谢参与', 'probability' => 1000]
];
数据库实现抽奖
// 假设奖品表包含id,name,probability,stock字段
function dbDraw($pdo) {
$pdo->beginTransaction();
try {
$stmt = $pdo->query("SELECT SUM(probability) AS total FROM prizes WHERE stock > 0");
$total = $stmt->fetchColumn();
$rand = mt_rand(1, $total);
$stmt = $pdo->prepare("SELECT id,name FROM prizes WHERE stock > 0 ORDER BY probability ASC");
$stmt->execute();
$current = 0;
while ($row = $stmt->fetch()) {
$current += $row['probability'];
if ($rand <= $current) {
$pdo->exec("UPDATE prizes SET stock = stock - 1 WHERE id = {$row['id']}");
$pdo->commit();
return $row['name'];
}
}
} catch (Exception $e) {
$pdo->rollBack();
return '抽奖失败';
}
}
抽奖算法优化 对于高并发场景,可以考虑以下优化:

- 使用Redis的原子操作
- 预先生成奖池
- 分布式锁机制
前端展示效果 配合AJAX实现动态抽奖效果:
$('#draw-btn').click(function(){
$.post('/draw.php', function(data){
$('#result').html('恭喜获得:' + data.prize);
});
});
安全注意事项
- 限制用户抽奖次数
- 记录抽奖日志
- 防止脚本刷奖
- 重要抽奖需验证用户身份
以上代码可根据实际需求进行调整,核心是根据业务场景选择合适的随机算法和概率控制方式。






