ホームページ  >  記事  >  バックエンド開発  >  PHP は、locking_php の例を通じて同時実行下でのコード取得機能を実現します

PHP は、locking_php の例を通じて同時実行下でのコード取得機能を実現します

WBOY
WBOYオリジナル
2016-08-17 13:02:34934ブラウズ

要件: コード取得機能

要件:

1. コード取得は特定の期間のみ可能です。

2. 各期間でリリースされるコードは限られています。


3. 各コードの重複は許可されません。

実装:

1. 同時実行性を考慮せずに実装する:

リーリー

上記のコードはデフォルトで現在の営業時間を満たしており、コードは繰り返されません。
同時実行性を考慮しない処理:

1) 現在のデータベースによって発行された確認コードの数を照会する場合に選択します。


2) まだ場所がある場合は、検証コードを生成してデータベースに挿入し、検証コードをクライアントに返します。

3) いっぱいの場合は、もう場所がないというプロンプトが返されます。

2. 同時条件での実装:


次に、同時条件下で上記のコードによって得られた結果を見てみましょう:


同時実行性をテストするには、Apache ベンチマークを使用できます。Apache ベンチマークは、APACHE の HTTP SERVER のパフォーマンス評価ツールです。cmd を通じて apche の bin ディレクトリに入り、ab -c 同時実行数 -n などの ab コマンドで呼び出します。合計訪問数 URL を測定



コードをコピーします


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

cb -c 100 -n 100 http://localhost/php_mulit.php
このようにして、100 人のユーザーと同僚が 1 つの割り当てを取得しようとします。クエリ中に、各ユーザーが割り当てがまだあることが判明すると、検証コードが生成されてデータベースに挿入され、検証コードが返されます。 ; これにより、認証コードが過剰に発行されます。実際、このコマンドを実行すると、データベースには 1 つではなく 13 個のレコードが追加されます。


これを回避するにはどうすればよいですか?

排他ロックを追加することで、判定から挿入までのプロセスをロックして、この判定プロセスで常に1つのプロセスだけが実行されるようにすることができます。実装は次のとおりです:

リーリー

flock関数を通じてプロセスをロックします。

flock の詳細については、php マニュアルを参照してください: http://php.net/manual/zh/function.flock.php

また走る



コードをコピーします


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

cb -c 100 -n 100 http://localhost/php_mulit.php データベースには 1 つのレコードのみが追加されるため、同時条件下でのデータの正確性が保証されます。

上記は、ロックによる同時実行下での PHP のコード取得機能についての編集者の紹介です。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。また、スクリプト ハウスの Web サイトをサポートしていただきありがとうございます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。