六万用户量同时进行抽奖活动,
奖池金额1000
一等奖 100 1名
二等级50 3名
三等奖20 10名
四等奖1-15元
五等奖 1分钱
<?php
//用户抽奖实列
//用户进行抽奖行为
index();
/*
* 开始抽奖
* $num 抽奖概率数组编号
* $jiangpin 奖品名称数组,yes 抽到的奖品名称, no为抽到奖品名称
* $number 抽奖概率数组编号,为了防止当一个奖品已经达到上限,在重复抽取
* $money 奖品金额数
*/
function index($num ="")
{
if(!$num) $num = 1;
$jiangpin = Choujiang($num);
$number = "";
switch ($jiangpin["yes"])
{
case "一等奖100元":
$money = 100;
$number = 1 ;
break;
case "二等奖50元":
$money = 50;
$number = 2 ;
break;
case "三等奖20元":
$money = 20;
$number = 3;
break;
case "四等奖1元-15元":
$money = rand(1,15);
$number = 4 ;
break;
case "五等奖1分钱":
$money = 0.01;
$number = 5 ;
break;
}
$jiangpin_name = countMoney($money);
if($jiangpin_name){
//执行新的抽奖前 判断一下该奖项是否已经达到上限
$num = Jiangpinpanduan($jiangpin_name);
}else{
echo "本次您未能中奖,谢谢参与";
exit();
}
//判断奖项数量 如果该奖已经达到上线,从新执行 如果是五等奖则不需要再进行抽取
if($num && $num !=5){
//为了防止重复抽中,做一下数据处理
if($num == $number) $num+=1;
index($num);
}else{
//计算四等奖的中奖金额
if($jiangpin["yes"] == "四等奖1元-15元"){
echo "四等奖".$money."元"; exit();
}else{
echo $jiangpin["yes"];exit();
}
//用户抽奖完成后将数据保存到数据库并更新redis
}
}
/*
* 判断当前用户抽到的钱数和已经抽过奖用户的钱数总数相加是否大于奖池金额1000元
* 奖池金额大于1000元返回false 在进来的用户就提示未抽到奖金
* 奖池小于1000元,看具体还差多少钱,来执行那个概率数组进行再次抽奖
*
* $money 本次抽奖金额
* $yichou_money 奖金池已抽金额总数
* $yu_money 未抽奖金额
*/
function countMoney($money)
{
//先判断用户已抽奖金 当前奖项+数据库查询的总和是否大于1000
$yichou_money = 100;
if($money+$yichou_money <= 1000){
$yu_money = bcsub(1000,$yichou_money,2);
if(!is_int($yu_money)) {
return "五等奖1分钱";
}
if($yu_money > 100) return "一等奖100元";
if($yu_money > 50 && $yu_money < 100) return "二等奖50元";
if($yu_money > 20 && $yu_money < 50) return "三等奖20元";
if($yu_money > 1 && $yu_money < 15) return "四等奖1元-15元";
}else{
return false;
}
}
/*
* 判断奖品上限
* $jiangpin_name 奖品名称
* $redis_array 模拟数据 已经被抽走的奖品
*
*/
function Jiangpinpanduan($jiangpin_name)
{
//从数据库中查询中奖数据保存到Redis,从Redis中取值 //$redis_array = $redis->strlen('zhongjiangxinxi');
$redis_array = array("一等奖100元","二等奖50元","二等奖50元","三等奖20元",
"三等奖20元","三等奖20元","五等奖1分钱","四等奖1元-15元","四等奖1元-15元","五等奖1分钱");
//查找该奖项是否被抽取,为真证明该奖项被抽取,在判断抽取次数是否达到上限,为假证明未被抽取,可以直 接放奖
if(in_array($jiangpin_name,$redis_array))
{
//整理奖项次数
$redis_array = array_count_values($redis_array);
if($jiangpin_name == "一等奖100元" && $redis_array["一等奖100元"] > 1){
return 2;
}
if($jiangpin_name == "二等奖50元" && $redis_array["二等奖50元"] < 5){
return 2;
}
if($jiangpin_name == "三等奖20元" && $redis_array["三等奖20元"] < 10){
return 3;
}
if($jiangpin_name == "四等奖1元-15元" && $redis_array["四等奖1元-15元"] < 20){
return 4;
}
if($jiangpin_name == "五等奖1分钱"){
return 5;
}
}else{
return false;
}
}
function Choujiang ($num)
{
$prize_arr = Gailv($num);
foreach ($prize_arr as $key => $val) {
$arr[$val['id']] = $val['v'];
}
$rid = Get_rand($arr); //根据概率获取奖项id
$res['yes'] = $prize_arr[$rid-1]['prize']; //中奖项
unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项
shuffle($prize_arr); //打乱数组顺序
$pr[] = "";
for($i=0;$i