ホームページ  >  記事  >  バックエンド開発  >  PHP インターフェースは同時実行性をどのように処理しますか?

PHP インターフェースは同時実行性をどのように処理しますか?

(*-*)浩
(*-*)浩オリジナル
2019-10-21 10:25:503539ブラウズ

製品ラッシュなどの同時実行シナリオでは、過剰販売が発生する可能性があります。現時点では、同時実行によって引き起こされる問題を解決する必要があります。

PHP 言語にはネイティブの提供がありません同時実行ソリューション同時実行制御を実現するには他の方法が必要です。

PHP インターフェースは同時実行性をどのように処理しますか?

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

flock 関数を使用してファイル ロックを取得します。このロックは同時に 1 つのスレッドによってのみ取得できます。ロックを取得していない他のスレッドはブロックされるか、取得が失敗します。

ロックを取得するときは、最初にインベントリをクエリします。インベントリが大きい場合は、在庫を減らしてからロックを解放します (推奨学習:

PHP ビデオ チュートリアル )

オプション 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 操作を実行します。戻り値が 0 以上の場合など、注文できますが、それ以外の場合は注文できません。この方法の方が効率的です

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

以上がPHP インターフェースは同時実行性をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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