PHP での同時処理のいくつかの方法

王林
リリース: 2023-04-07 14:32:01
オリジナル
3329 人が閲覧しました

PHP での同時処理のいくつかの方法

商品の駆け込み購入などの同時並行シナリオでは、過剰販売が発生する可能性があり、現時点では同時並行性によって引き起こされる問題を解決する必要があります。

PHP 言語にはネイティブの同時実行ソリューションがないため、同時実行制御を実現するには他のメソッドが必要です。

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

ファイル ロックの取得には、flock 関数が使用されます。このロックは、同時に 1 つのスレッドによってのみ取得できます。ロックを取得するスレッドはブロックされているか、ロックの取得に失敗します。ロックを取得する場合は、まず在庫を問い合わせ、在庫が0より大きい場合は発注し、在庫を減らしてからロックを解除します。

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

Innodb ストレージ エンジンは行レベルのロックをサポートしています。データの行がロックされると、他のプロセスはアクセスできなくなります。行をロックします。データが操作されます。

最初に行をクエリしてロックします:

select stock_num from table where id=1 for update
ログイン後にコピー
if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}
ログイン後にコピー

オプション 3: キューを使用します

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

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

Redis の操作はすべてアトミックです。商品の在庫を Redis に保存し、商品を配置する前に在庫に対して Decr 操作を実行できます。 order. 、戻り値が 0 以上の場合は注文できますが、それ以外の場合は注文できません。このメソッドの方が効率的です。

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}
ログイン後にコピー

推奨チュートリアル: PHP ビデオ チュートリアル

以上がPHP での同時処理のいくつかの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート