台州温岭做网站请找我们 (专业建站 | 诚信服务) 13958630945 在线客服 联系技术

佳源设计|台州网站建设|佳源网页设计

网站当前位置: 首页>>做网站步骤>>用文件锁排他锁实现商品秒杀、抢购
建站流程
 
建站知识
 
网站建站疑难
 
网站设计_图象处理
 
网站设计_Css样式
 
网站建设_Flash疑难
 
手机网站建设
 
 建站知识搜索
 

台州网站建设
 
网站优化
 
提交疑问
 做网站步骤 > 用文件锁排他锁实现商品秒杀、抢购

用文件锁排他锁实现商品秒杀、抢购

216次浏览
2022-02-25
在处理下单请求的时候,用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
上一篇 >>nginx、iis7.5实现多个ssl证书
下一篇 >>H5动画