求php高並發下抽獎程式,如何處理重複中獎及多人抽中同一個獎

來源:互聯網
上載者:User
求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、修改獎池並釋放資源

無論是即開即兌還是到期一次性對付的都可以如法炮製
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.