求php高並發下抽獎程式,如何避免重複中獎及多人抽中同一個獎?
我的做法是比如:一等獎: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高並發下抽獎程式,如何避免重複中獎及多人抽中同一個獎?
或者從別的思路出發考慮抽獎程式。 並發 php 抽獎
分享到:
------解決方案--------------------
1、生產成獎池 $arr = array_merge($real, $empty);
2、儲存於檔案或獨立表中
3、抽獎時以獨佔方式開啟檔案或表(後續的抽獎這隻能排隊來等待資源的釋放)
4、修改獎池並釋放資源
無論是即開即兌還是到期一次性對付的都可以如法炮製