この記事では、同時実行の問題を解決するための 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 中国語 Web サイトの他の関連記事を参照してください。