在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙",计数器存储抢购的商品数量,避免查询数据库。
阻塞(等待)模式:并发时,当有第二个用户请求时,会等待第一个用户请求完成、释放锁,获得文件锁之后,程序才会继续运行下去 <?php $fp = fopen('lock.txt', 'w'); if(flock($fp, LOCK_EX)){ //文件独占锁,阻塞 $number; // 计数器 if($number>=1){ //处理订单 $number--; }else{ //商品已经抢购完 } flock($fp, LOCK_UN); //释放锁 } fclose($fp); ?> 非阻塞模式:并发时,第一个用户请求,拿得文件锁之后。后面请求的用户直接返回系统繁忙,请稍后再试 <?php $fp = fopen('lock.txt', 'w'); if(flock($fp, LOCK_EX|LOCK_NB)){ //文件独占锁,非阻塞 $number; // 计数器 if($number>=1){ //处理订单 $number--; }else{ //商品已经抢购完 } flock($fp, LOCK_UN);//释放锁 }else{ //系统繁忙,请稍后再试 } fclose($fp); ?>
优化方案1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为负数,将会返回false
//库存减少 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and number>0"; $store_rs=mysql_query($sql,$conn); if(mysql_affected_rows()){ insertLog('库存减少成功'); } 参考https://blog.csdn.net/nuli888/article/details/51865401 页面所在本站地址: http://www.52-life.net/N_fopenPHP.htm |