phpは買い占め秒殺抽選などの大流量を同時に入庫したことによる在庫の負数の問題を解決します。


私達はデータベース処理のsqlが一本の処理であることを知っています。もし商品を買う流れはこうです。
sql 1:商品の在庫を調べる

if(     > 0)
{
  //    ...
  sql2:  -1
}
もし同時に注文したら、在庫はもう一つしかないです。sql 1段階で、二人で調べた在庫は全部ゼロになりました。それで、最後にsql 2を実行しました。在庫は最後に-1になりました。
この問題を解決するのに流行している考え方:
1.追加のプロセスで1つのキューを処理して、注文書をキューに入れてください。一つずつ処理すれば、同時に問題が発生しなくなります。しかし、追加のバックグラウンドプロセスと遅延問題は考慮されません。
2.データベースは楽観的にロックして、大体の意味は先に在庫を調べて、すぐに在庫を+1して、それから注文書を作成した後、在庫を更新する前にもう一度在庫を調べて、予想の在庫数と一致しているかどうかを確認して、一致しないならば、またロールバックして、ユーザーの在庫不足をヒントします。
3.udateの結果から判断すると、sql 2の時に判断条件udate...where在庫>0を追加してfalseに戻ると、在庫不足を説明し、事務を切り返すことができます。
4.ファイルの排他的なロックを使って、注文の要求を処理する時に、flockで一つのファイルをロックします。もしロックが失敗したら、他の注文が処理されていると説明します。この時は待っているか、あるいは直接にユーザーに「サーバーが忙しい」と提示します。
本論文では第4の案を言います。大体のコードは次の通りです。
ブロック(待ち)モード

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
  //..    
  flock($fp,LOCK_UN);
}
fclose($fp);
?>
非ブロッキングモード

<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
  //..    
  flock($fp,LOCK_UN);
}
else
{
  echo "    ,     ";
}

fclose($fp);
?>