ホームページ  >  記事  >  バックエンド開発  >  PHPを活用した大トラフィック時の駆け込み購入ソリューション事例を詳しく解説

PHPを活用した大トラフィック時の駆け込み購入ソリューション事例を詳しく解説

小云云
小云云オリジナル
2017-12-18 10:17:211371ブラウズ

この記事では、大規模なトラフィック下でのラッシュバイイングを実装するための PHP の計画についての簡単な議論を主に紹介します。編集者は、これが非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

時、分、秒のリアルタイムのカウントダウンを表示する必要があります。クライアント側で日付と時刻を変更しても、カウントダウンの通常の表示 (つまり、サーバー時間に基づく) には影響しません。

実際、これには多くの試験や他のシステムの時間制限機能と同じ要件があります。

Ajax を使用してサーバー時間を毎秒取得することはできないため、リアルタイムのカウントダウンは JavaScript で実装する必要があります。これは非常に簡単で、インターネット上にたくさんの例があります。

ここでの問題は、ユーザー側で変更された日付と時刻がディスプレイに与える影響を解決することです。

解決策は、クライアント時間とサーバー時間の間の時間差を計算し、問題を解決することです。

この方法では、php を 1 回実行するだけで済み、リアルタイムのカウントダウン時間がサーバー時間と同期されます。

理論上は同期していますが、実際のテストでは1秒の誤差が生じます。 (具体的な理由はインターネット速度に関連しています。インターネット速度が速いほど、誤差は小さくなります。) しかし、これが上記の要件に影響することはありません。

注: フラッシュセールの時間は朝から午後10時までです。

コードは次のとおりです:


<?php
//php的时间是以秒算。js的时间以毫秒算
date_default_timezone_set(&#39;PRC&#39;); 
//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 つずつ処理するため、同時実行の問題は発生しません。バックグラウンドプロセスが必要であり、遅延は考慮されません。

2. データベースのオプティミスティック ロック。大まかに言うと、最初に在庫をクエリし、すぐに在庫に 1 を追加し、注文が生成された後、在庫を更新する前に再度在庫をクエリして、予想される在庫と一致しているかどうかを確認します。数量が矛盾している場合はロールバックし、在庫が不十分であることをユーザーに通知します。

3. 更新結果に基づいて判定するには、sql2に判定条件updateを追加します... where inventory > 0. falseが返された場合、在庫が不足していることを意味し、トランザクションはロールバックされます。

4. ファイル排他ロックを使用して、注文リクエストを処理するときに、flock を使用してファイルをロックします。ロックが失敗した場合は、その時点で待機するか、ユーザーに直接プロンプトを表示します。 「サーバーがビジーです」

この記事で言いたいこと 4 番目の解決策は、大まかに次のようなコードです:

ブロッキング (待機) モード

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。