この記事では、大規模なトラフィック下でのラッシュバイイングを実装するための PHP の計画についての簡単な議論を主に紹介します。編集者は、これが非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
時、分、秒のリアルタイムのカウントダウンを表示する必要があります。クライアント側で日付と時刻を変更しても、カウントダウンの通常の表示 (つまり、サーバー時間に基づく) には影響しません。
実際、これには多くの試験や他のシステムの時間制限機能と同じ要件があります。
Ajax を使用してサーバー時間を毎秒取得することはできないため、リアルタイムのカウントダウンは JavaScript で実装する必要があります。これは非常に簡単で、インターネット上にたくさんの例があります。
ここでの問題は、ユーザー側で変更された日付と時刻がディスプレイに与える影響を解決することです。
解決策は、クライアント時間とサーバー時間の間の時間差を計算し、問題を解決することです。
この方法では、php を 1 回実行するだけで済み、リアルタイムのカウントダウン時間がサーバー時間と同期されます。
理論上は同期していますが、実際のテストでは1秒の誤差が生じます。 (具体的な理由はインターネット速度に関連しています。インターネット速度が速いほど、誤差は小さくなります。) しかし、これが上記の要件に影響することはありません。
注: フラッシュセールの時間は朝から午後10時までです。
コードは次のとおりです:
<?php //php的时间是以秒算。js的时间以毫秒算 date_default_timezone_set('PRC'); //date_default_timezone_set("Asia/Hong_Kong");//地区 //配置每天的活动时间段 $starttimestr = "08:00:00"; $endtimestr = "22:00:00"; $starttime = strtotime($starttimestr); $endtime = strtotime($endtimestr); $nowtime = time(); if ($nowtime<$starttime){ die("活动还没开始,活动时间是:{$starttimestr}至{$endtimestr}"); } $lefttime = $endtime-$nowtime; //实际剩下的时间(秒) ?> <script language="JavaScript"> </script> <h4><strong id="RemainH">XX</strong>:<strong id="RemainM">XX</strong>:<strong id="RemainS">XX</strong></h4>
上記は問題ないようですが、トラフィックが発生した場合、大量のトラフィックが同時に発生することによるマイナス在庫の問題など、間違った数量で問題が発生します。 warehousing
商品の購入プロセスが次のようになっていると仮定すると、データベース処理 SQL は 1 つずつ処理されることがわかります。とても完璧です。2 人が同時に注文し、在庫が 1 だけだとします。SQL1 の段階では、2 人がクエリした在庫は 0 を超えていたため、最終的に SQL2 を実行し、在庫は -1 になりました。在庫を補充するか、ユーザーからの苦情を待つことを示します。
この問題を解決するための一般的なアイデア:
1. 追加の単一プロセスを使用してキューを処理し、注文リクエストをキューに入れて 1 つずつ処理するため、同時実行の問題は発生しません。バックグラウンドプロセスが必要であり、遅延は考慮されません。
ブロッキング (待機) モード
if(库存数量 > 0) { //生成订单… sql2:库存-1 }
ノンブロッキング モード
<?php $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_EX)) { //..处理订单 flock($fp,LOCK_UN); } fclose($fp); ?>
関連推奨事項:
PHP は、高い同時実行性で大規模な Web サイトのトラフィックの問題をどのように解決するか
PHP の高トラフィックの最適化?
PHP製品フラッシュセールのタイミング実装(大規模トラフィックの解決策)
以上がPHPを活用した大トラフィック時の駆け込み購入ソリューション事例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。