1、超发缘由
假定某个抢购场景中,我们一共只要100个商品,在末了一刻,我们已斲丧了99个商品,仅剩末了一个。这个时刻,体系发来多个并发要求,这批要求读取到的商品余量都是99个,然后都通过了这一个余量推断,终究致使超发。
在上面的这个图中,就致使了并发用户B也“抢购胜利”,多让一个人获得了商品。这类场景,在高并发的情况下异常轻易涌现。
文件锁思绪
关于日IP不高或者说并发数不是很大的运用,平常不必斟酌这些!用平常的文件操纵方法完整没有问题。但假如并发高,在我们对文件举行读写操纵时,很有能够多个历程对进一文件举行操纵,假如这时候不对文件的接见举行响应的独有,就轻易形成数据丧失。
优化计划:运用非壅塞的文件排他锁
<?php //优化计划4:运用非壅塞的文件排他锁 include ('./mysql.php'); //生成唯一订单号 function build_order_no(){ return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); } //纪录日记 function insertLog($event,$type=0){ global $conn; $sql="insert into ih_log(event,type) values('$event','$type')"; 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='$goods_id' and sku_id='$sku_id'"; $rs = mysqli_query($conn,$sql); $row = $rs->fetch_assoc(); if($row['number']>0){//库存是不是大于0 //模仿下单操纵 $order_sn=build_order_no(); $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; $order_rs = mysqli_query($conn,$sql); //库存削减 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'"; $store_rs = mysqli_query($conn,$sql); if($store_rs){ echo '库存削减胜利'; insertLog('库存削减胜利'); flock($fp,LOCK_UN);//开释锁 }else{ echo '库存削减失利'; insertLog('库存削减失利'); } }else{ echo '库存不够'; insertLog('库存不够'); } fclose($fp); ?>
引荐教程:PHP视频教程
以上就是php怎样防备高并发的细致内容,更多请关注ki4网别的相干文章!