この投稿は dr21c によって最終編集されました (2015-09-14 15:59:09)まず環境について話しましょう:
windows 2003 iis php mysql
Alibaba Cloud 4 コア 4G 5M クラウド サーバー
現在の問題: (何度もテストされており、運用上の要因は排除できます)
a. オークションの入札が早すぎて、ページが停止しました (参加者が 5 人しかいなかった場合)
b. ページが更新されるとすぐに、$GLOBALS['user_info'] データが失われました。ユーザーはログインしていなくなり、プログラム管理のバックグラウンドも終了しました。
当初はオンラインで 300 人が同時に入札できるようにしたいと考えていましたが、現在 5 人では対応できません。
自分で調べたところ、ビジネス ロジックのコードの書き方が不十分でした。モデレーターと専門家からのアドバイス
プログラムの実装方法:
1. メンバーのログイン。メンバーがオンラインであるかどうかを確認するために、$GLOBALS['user_info'] が生成されます。 、この変数は session
の代わりに使用されます。 2. オークションの実装方法、
1. 最初にデータベース登録レコードをクエリします。登録していない場合は、オークションに参加できません。 $had_sign = $GLOBALS['db']->getOne("select id from ".DB_PREFIX."sign where deal_id= " . $dat['id'] . " and user_id = " . $udata['id']);
2. 次に、このオークション アイテムの現在の価格 (オークション入札リスト) をクエリします。現在の価格 (入札リスト) が存在しない場合は、この手順を通じて開始価格 (入札アイテム リスト) を取得します。入札アイテムの現在の価格が取得されます。
3. ユーザーの入札が現在の価格より高いかどうかを判断します。そうでない場合は、入札は通過しません。
4. 上記の条件を満たしている場合、最新の価格データ (オークション入札テーブル) を挿入します。
5. ajax_return($data); ajax は最新のデータを返します。
[途中で制限を設けました]
// ライブラリへの書き込みにより送信頻度を制限します
$c_time = $GLOBALS['db']->getOne("select create_time from ".DB_PREFIX."estate_biding_lock where deal_id= " . $dat['deal_id'] . " and user_id = " . $dat['user_id'] . " order by id desc limit 1");
if($ c_time) {
if (()-$ c_time) & lt; {// 5 秒を制限 2015-09-06 10:59:33
... 、時間間隔により送信頻度が制限されます。
// ファイルを生成することで送信頻度を制限します
$lockfile = "lock.txt";
if(file_exists($lockfile)){
$data['state' ] = 0 ;
$data['info'] = "
入札は熾烈です。待ってから入札してください...";
ajax_return($data ) ;
exit;
}else{
// ロック ファイルを生成します
$myfile = fopen($lockfile, "w");
$txt = "lock";
fwrite ($myfile, $txt);
fclose($myfile);
}
オークション落札後は後日削除させていただきます。
オークション ページ:
A. オークションが開始されると、setTimeout("get_auction_list()", 1000) が $.post でデータベースにクエリを実行し、最新の入札リストと最新 価格はページに表示されます。つまり、ajax はリアルタイムで更新されます。
// 最新の入札リストを取得します
1. データベース内のこのプロジェクトの最新の入札データをクエリし、処理しますそしてデータを判断します。
2. データベース内の最新の入札記録を再度クエリして、最新の価格を取得します。
3. このアイテムの開始価格と各値上げ (固定) をクエリし、新しい最低入札額を返します。 (クエリを行わずにこのステップを解決することを考えただけです)
4. Ajax はデータを返します。
-----ソリューションのアイデア----------------------1. コードに SQL インジェクションがあります
2. ユーザー情報のグローバル ストレージが信頼できないため、セッションを使用しないのはなぜですか
3. プログラムに問題がある場合。 、ロックは決して解除できない可能性があります。開けることはできません
-----解決策のアイデア---------------------- $GLOBALS 現在のみページ内で有効であり、メンバーがオンラインであるかどうかの確認には使用できません
ユーザーがログインしている場合、登録フォームを確認する必要はなく、ログイン時に遷移ステータスが設定されます
入札価格を直接置き換えるには、当然、見積り条件 > 入札価格を追加する必要があります
入札価格を選択します。 ユーザーに戻ります
ajax ロングポーリングはリアルタイムパフォーマンスが低いため、websock
を考慮する必要があります