求php高并发下抽奖程序,如何避免重复中奖及多人抽中同一个奖?

战狼传说2012 2013-09-15 11:07:28
我的做法是比如:一等奖:1个,二等奖:2个,三等级:3个,这样有奖项为6,假如100人同时参与抽奖,那么空奖项为100-6=94项。

首先从数据库mysql查询出有奖项6个的唯一编号作为兑奖号:
sql1:
$sql="select 唯一编号 from table where status=0";
得到数组$real=array('001','002','003','004','005','006',);其中001,002就是唯一编号

然后生成94个空奖
$empty=array('','',...,'',);

最后把数组合并,得到一个全新的数组。
$arr = array_merge($real, $empty);

用户随机在数组中抽取一项
$rand= mt_rand(0, count($arr)-1);

比如$rand抽到了001
if(''!=$rand){
//表示抽中,修改数据状态,这里需要操作数据库

sql2:
$sql="update table set status=1 where 唯一编号=001";
操作完成

}else{
//表示没有抽中,不做操作。
}



现在的问题是当100人同时进入抽奖,在红色部分sql2,还没有来的急修改状态的情况下,sql1继续会把001作为没有抽中的奖项,来让其他用户继续抽,这样有可能001再次被抽到。

想请大家帮助php高并发下抽奖程序,如何避免重复中奖及多人抽中同一个奖?

或者从别的思路出发考虑抽奖程序。
...全文
1462 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
世宝宝 2013-09-17
  • 打赏
  • 举报
回复
这是PHP的一个特点(或缺点),因为它是多进程独立的,本身无法解决并发同步的问题,可以借助其它程序来实现,比如利用Memcached单线程的特性。
tiyee 2013-09-16
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
1、生产成奖池 $arr = array_merge($real, $empty); 2、保存于文件或独立表中 3、抽奖时以独占方式打开文件或表(后续的抽奖这只能排队来等待资源的释放) 4、修改奖池并释放资源 无论是即开即兑还是到期一次性对付的都可以如法炮制
应该就是队列吧。 直接存memcache是不是更好呢?
码无边 2013-09-16
  • 打赏
  • 举报
回复
抽奖并发,让每个用户实现队列抽奖。
blizzf99 2013-09-16
  • 打赏
  • 举报
回复
顶帖收藏~~~~
ImN1 2013-09-15
  • 打赏
  • 举报
回复
很难想象你是设计怎么会是一边参加一边抽奖…… 参加抽奖不设截止时间的么?如果有那就是两个过程,问题不存在了
xuzuning 2013-09-15
  • 打赏
  • 举报
回复
1、生产成奖池 $arr = array_merge($real, $empty); 2、保存于文件或独立表中 3、抽奖时以独占方式打开文件或表(后续的抽奖这只能排队来等待资源的释放) 4、修改奖池并释放资源 无论是即开即兑还是到期一次性对付的都可以如法炮制
ImN1 2013-09-15
  • 打赏
  • 举报
回复
你这个是在线游戏?需要客户端参与?
战狼传说2012 2013-09-15
  • 打赏
  • 举报
回复
引用 3 楼 snmr_com 的回复:
既然有截止时间,那跟高并发有啥关系? 读出合资格的到一个数组,抽一次就把抽出来的从数组去掉,依次抽奖就是了
sql1 未中奖的编号有001 002 003 004 005 006 sql2 中用户1中了001,正常情况下未中奖的编号剩002 003 004 005 006 特殊情况下当sql2还未来的急修改001中奖状态为已中奖的情况下,用户2查询sql1得到的未中奖编号还会是001 002 003 004 005 006这样用户2也有可能再次中001
ImN1 2013-09-15
  • 打赏
  • 举报
回复
既然有截止时间,那跟高并发有啥关系? 读出合资格的到一个数组,抽一次就把抽出来的从数组去掉,依次抽奖就是了
战狼传说2012 2013-09-15
  • 打赏
  • 举报
回复
引用 1 楼 snmr_com 的回复:
很难想象你是设计怎么会是一边参加一边抽奖…… 参加抽奖不设截止时间的么?如果有那就是两个过程,问题不存在了
截止时间是有的啊 比如抽奖时间为今天2013-09-15截止2013-10-15号 你能详细介绍一下你的方案吗?
仅限学习研究之用,切勿用作商业用途,请在下载后24小时之内删除,本人不承担任何责任。 鸿运年会抽软件是功能强大的年会抽软件,界面大气漂亮,可设置不同的抽形式,自定义抽人数和项数,滚动显示抽人的照片和名字,极简单的设置方式。在年会和各种晚会用最合适了。 鸿运年会抽软件历经上千家公司和个人实践检验,好评百分百!还可以根据您的需定制开发(按复杂度酌情加收费用)。 鸿运年会抽软件功能特点简介: *公正、公平、不重复 *界面美观大方,鲜明的中国传统色彩(可选喜庆类、人文类、科技类等诸多界面) *运行稳定 功能强大 简洁易用 美观流畅 *支持显示序号;号码滚动显示 *支持自定义背景音乐;可自定义各项获人数;可自定义重复规则; *支持双显示器(例如笔记本电脑连接投影仪) *支持外部数据加入(加入大量附加数据稳定版) *支持一次抽出全部者或者分多次抽出者 *支持显示抽活动所有抽出的者 *支持名单保存.支持一键抽; *支持“抽参数”保存,下次打开时“直接使用” *支持:“文字字符窜抽” *支持非号码数字抽,即支持姓名等中文字符抽 *可根据客户的需要定制开发,软件界面及其他均可定制开发 鸿运年会抽软件适用于各单位年终抽、晚会抽、姓名抽、编号抽、手机号码抽、身份证号码抽、企事业单位抽、电视台抽、屏幕抽、LED抽
该抽插件主要用于动态网站(ASP,PHP,.NET,JSP,JS等)WEB页面中的抽活动使用,适用于二次开发使用;使用时请参考CHM说明书或文本说明; 1、可以设置每个品的概率,概率可以设置为0(即为不中这个项)或100%(一定中这个项,前提本品数量大于0); 2、目前唯一一款可以调节概率模式的抽插件,可以根据网站的规模和实际情况,调节概率模式,更有利于抽活动的进行; 3、可以更换品图片,尺寸参考说明; 4、设置品名称,品名称可以在抽转盘中在鼠标滑过不同品图片时提出品信息; 5、设置品数量,品数量与名称均可以以揭示信息的形式显示出来,本程序相对其它抽插件更为合理与严谨,很多抽程序虽也可以设置品数量并传递给Flash转盘,但品数量不能实时更新,犯下了与现实场景抽活动的错误,请大家注意,网页抽是面对N多个用户同时自助抽的,品数量有可能在用户打开网页后,其它用户也在抽,故品数量在动态变化的; 6、可以按商家自己需更换或设计不同的转盘背景,转盘指针,开始按钮等,方法参考说明; 7、抽程序可以以积分形式或登陆抽等形式进行,具体请参考说明; 8、抽插件使用时可以直接将抽转盘移于自己网页页面当中.....

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧