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 操作を実行します。戻り値が0 以上の場合は注文できます。それ以外の場合は注文できません。この方法の方が効率的です。
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }
その他の並行性の問題:
実際のアプリケーションでは、多くの場合場合によっては、データはキャッシュに保存されます。キャッシュに障害が発生した場合は、データベースに移動してデータを取得し、キャッシュをリセットします。この時点で同時実行数を超えると、非常に大規模になります。多くのプロセスがキャッシュに送信されます。データベースが同時にデータを取得すると、多数のリクエストが発生し、
データベースに侵入し、データベースがクラッシュします。ファイル ロックを使用すると、この問題を解決できます
$data = $cache->get('key'); if(!$data){ $fp = fopen('lockfile'); if(flock($fp, LOCK_EX)){ $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了 if(!$data){ $data = mysql->query(); $cache->set('key', $data); } flock($fp, LOCK_UN); } fclose($fp); }
以上がPHPの同時実行メソッドとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。