ホームページ  >  記事  >  バックエンド開発  >  同時実行の問題を解決するための PHP のいくつかの実装

同時実行の問題を解決するための PHP のいくつかの実装

不言
不言オリジナル
2018-04-19 15:06:002529ブラウズ

この記事では、同時実行の問題を解決するための PHP の実装をいくつか紹介します。必要な場合は、それを参考にしてください。今回は、同時実行によって発生する問題を解決する必要があります。PHP 言語にはネイティブの同時実行ソリューションがないため、他の方法を使用して同時実行制御を実現する必要があります。

オプション 1: ファイル ロックの排他的ロックを使用する

ファイル ロックを取得するには、同時に 1 つのスレッドのみが取得できます。ロックを取得していない他のスレッドはブロックされるか、取得が行われません。失敗します

取得後 ロックに達したら、まず在庫をクエリし、在庫が 0 より大きい場合は、注文し、在庫を減らしてからロックを解放します

オプション 2: 提供された悲観的ロックを使用します。 MySQL データベースによる


Innodb ストレージ エンジンは行レベルのロックをサポートしています。データの行がロックされている場合、他のプロセスはこのデータの行を操作できません

最初にクエリを実行して行をロックします。id=1 のテーブルから Stock_num を選択します。 update

if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}

オプション 3: キュー

を使用してユーザーのデータをダウンロードする単一のリクエストが順番にキューに保存され、別のプロセスがバックグラウンドで使用されてキュー内の注文リクエストを処理します

オプション4: Redis を使用する


Redis の操作はすべてアトミックであり、商品の在庫を保存できます。 Redis では、注文する前に在庫に対して decr 操作が実行され、戻り値が 0 以上の場合、注文を行うことができます。それ以外の場合、注文は実行できません。この方法の方が効率的です

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}

その他の同時実行の問題:


実際のアプリケーションでは、多くの場合、キャッシュが失敗すると、データがキャッシュに保存されます。この時点で同時実行性が大きい場合、多くのプロセスが同時にデータベースにアクセスしてデータを取得し、多数のリクエストがデータベースに侵入することになります。データベースがクラッシュする場合は、ここでファイルロックを使用して問題を解決できます



[php]

プレーン表示

コピー

rree

へ率直に言って、ロックは同時実行の問題を解決するために必要です

関連する推奨事項:


php は大量のデータを投稿する際の損失の問題を解決します

PHP はセッションファイルのブロックを解決します

PHP は JSON 中国語表示の問題を解決します

以上が同時実行の問題を解決するための PHP のいくつかの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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