PHP で同時実行性の高い宝くじプログラムをお探しですか?

WBOY
リリース: 2016-06-23 14:22:03
オリジナル
2074 人が閲覧しました

同時PHP抽選

私の考え方は以下の通りです: 1等: 1、2等: 2、3級: 3。 このように、賞品の数は6です。 100人が同時に抽選に参加した場合、この場合、空の賞品は 100 -6 = 94 個のアイテムになります。

まず、引き換え番号としてデータベース mysql から 6 つの特典の一意の番号をクエリします。
sql1:
$sql="select unique number 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 unique number=001" ;
操作が完了しました

}else{
//結果が描画されず、操作が実行されないことを示します。
}



現在の問題は、100人が同時に抽選に参加した場合、赤い部分のsql2で、緊急変更ステータスがまだ来ていないときに、sql1は引き続き001を未抽選の賞品とみなして許可することです。他のユーザーが描画を続行するため、001 が再度描画される可能性があります。

PHP で同時実行性の高い宝くじプログラムを実行するのに協力していただきたいのですが、当選が繰り返されたり、複数の人が同じ賞品を当選したりすることを回避するにはどうすればよいですか?

あるいは、他のアイデアから抽選手順を検討してください。

ディスカッションへの返信(解決策)

デザイン中に抽選に参加する方法を想像するのは難しい...

抽選への参加に期限はありませんか?存在する場合、プロセスは 2 つあり、問題は存在しません




デザインしながら抽選に参加する方法を想像するのは難しい...

抽選に参加する期限はありませんか?プロセスが 2 つある場合、問題は存在しません


期限があります。たとえば、抽選の時間は今日 2013 年 9 月 15 日で、2013 年 10 月 15 日に終了します
あなたの計画を詳しく紹介していただけますか。

期限があるということは、高い同時実行性とどのような関係があるのでしょうか?

修飾されたものを配列に読み出し、一度描画したら配列から削除し、順番に描画するだけです


期限があるので、高い同時実行性と何の関係があるのでしょうか?

条件を満たしたものを配列に読み出し、一度描画し、描画されたものを配列から削除し、賞品を 1 つずつ描画します。

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 を獲得する可能性があります

これはオンライン ゲームですか?クライアントの参加が必要ですか?

1. 賞金プールを生成します $arr = array_merge($real, $empty);

2. それをファイルまたは独立したテーブルに保存します

3. 宝くじ中のみファイルまたはテーブルを開きます (その後の抽選はキューに入れることしかできません) ) リソースのリリースを待っています)
4. 賞金プールを変更し、リソースをリリースします

即時引き換えでも、期限切れ時の 1 回限りの取引でも、同じことを行うことができます

宝くじは同時実行され、それぞれを許可しますユーザーがキュー抽選を実現します。

1. 賞金プールを生成します $arr = array_merge($real, $empty);

2. それをファイルまたは独立したテーブルに保存します

3. 宝くじ中は排他的にファイルまたはテーブルを開きます (その後の抽選はキューに入れられるだけです) ) リソースのリリースを待っています)
4. 賞金プールを変更してリソースをリリースします

即時引き換えであっても、期限切れ時の 1 回限りの取引であっても、同じことを行うことができます
キューになるはずです。
memcache に直接保存した方が良いでしょうか?

これは PHP の機能 (または欠点) です。PHP はマルチプロセスに依存せず、単独では同時同期の問題を解決できないため、PHP のシングルスレッド機能など、他のプログラムの助けを借りて実現できます。メムキャッシュ。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート