商品の駆け込み購入などの同時並行シナリオでは、過剰販売が発生する可能性があり、現時点では同時並行性によって引き起こされる問題を解決する必要があります。
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 サイトの他の関連記事を参照してください。