ホームページ >バックエンド開発 >PHPの問題 >PHPでの同時実行性の高さを防ぐ方法

PHPでの同時実行性の高さを防ぐ方法

王林
王林オリジナル
2019-09-30 17:44:043809ブラウズ

PHPでの同時実行性の高さを防ぐ方法

1. 過剰発行の理由

急ぎ購入のシナリオでは、合計で 100 製品しかないとします。最後の瞬間、購入した商品は 99 個消費され、最後の 1 個だけが残っています。このとき、システムは複数のリクエストを同時に送信し、そのリクエストで読み取った商品残高が99個すべてで残高判定を通過し、最終的に発行過剰に陥ってしまいました。

PHPでの同時実行性の高さを防ぐ方法

上の図では、同時ユーザー B も「購入に成功」し、さらに 1 人が製品を入手できるようになりました。このシナリオは、同時実行性が高い状況で非常に発生しやすくなります。

ファイル ロックのアイデア

日次 IP が高くない、または同時実行数がそれほど多くないアプリケーションの場合は、通常、これらを考慮する必要はありません。通常のファイル操作方法では全く問題ありません。しかし、同時実行性が高い場合、ファイルの読み書きを行うときに、次のファイルに対して複数のプロセスが動作する可能性が高く、このときファイルへのアクセスが排他的でない場合、データ損失が発生しやすくなります。

PHPでの同時実行性の高さを防ぐ方法

最適化ソリューション: ノンブロッキング ファイル排他ロックを使用する

<?php

//优化方案4:使用非阻塞的文件排他锁

include (&#39;./mysql.php&#39;);

//生成唯一订单号

function build_order_no(){

return date(&#39;ymd&#39;).substr(implode(NULL, array_map(&#39;ord&#39;, str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

}

//记录日志

function insertLog($event,$type=0){

global $conn;

$sql="insert into ih_log(event,type)

values(&#39;$event&#39;,&#39;$type&#39;)";

mysqli_query($conn,$sql);

}

$fp = fopen("lock.txt", "w+");

if(!flock($fp,LOCK_EX | LOCK_NB)){

echo "系统繁忙,请稍后再试";

return;

}

//下单

$sql="select number from ih_store where goods_id=&#39;$goods_id&#39; and sku_id=&#39;$sku_id&#39;";

$rs = mysqli_query($conn,$sql);

$row = $rs->fetch_assoc();

if($row[&#39;number&#39;]>0){//库存是否大于0

//模拟下单操作

$order_sn=build_order_no();

$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)

values(&#39;$order_sn&#39;,&#39;$user_id&#39;,&#39;$goods_id&#39;,&#39;$sku_id&#39;,&#39;$price&#39;)";

$order_rs = mysqli_query($conn,$sql);

//库存减少

$sql="update ih_store set number=number-{$number} where sku_id=&#39;$sku_id&#39;";

$store_rs = mysqli_query($conn,$sql);

if($store_rs){

echo &#39;库存减少成功&#39;;

insertLog(&#39;库存减少成功&#39;);

flock($fp,LOCK_UN);//释放锁

}else{

echo &#39;库存减少失败&#39;;

insertLog(&#39;库存减少失败&#39;);

}

}else{

echo &#39;库存不够&#39;;

insertLog(&#39;库存不够&#39;);

}

fclose($fp);

?>

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

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

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