结构代码

public function index(){

        $fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
// 处理商品数据 flock($fp,LOCK_UN);
}
fclose($fp);
}

概述:

1.首先,读写方式打开或者创建文件lock.txt文件

2.给lock.txt文件上 "独占锁",上锁成功后就可以进行下一步"处理订单商品数据了"

3.处理完数据后,要"释放锁”,以及fclose关闭打开的文件

注意:给文件“独占锁”后,如果再没有里面的“释放锁”,就没有下一个"轮回"

fopen详细介绍:http://www.w3school.com.cn/php/func_filesystem_fopen.asp

flock详细介绍:http://www.w3school.com.cn/php/func_filesystem_flock.asp

fclose详细介绍:http://www.w3school.com.cn/php/func_filesystem_fclose.asp

详细代码

namespace app\index\controller;
use think\Controller;
use think\Cache; class Index extends Controller
{ /**
* 首页
* */
public function index(){ $fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX)) //锁定当前指针,,,
{
//..处理订单 $stock = $this->findStock();
if($stock > ){
$this->setDec();
}else{
return '抢购失败';
}
return $stock;
flock($fp,LOCK_UN);
}
fclose($fp);
} /**
* 查询数据库库存
* */
public function findStock(){
$res = db('info')->where('id',)->field('stock')->lock(true)->find();
return $res['stock'];
} /**
* 减少库存操作
* */
public function setDec(){
$res = db('info')->where('id',)->setDec('stock',);
return $res;
}
}

总结有点:

1.可以解决并发问题,库存为负数的情况。

2.并发是,大家都在等待。当所有并发结束后,才会获得跳转(这也是缺点,如果处理1000条并发,需要时间15s,那么所有参加的人都需要等待15s后才进入下一个页面)

非阻塞模式

结构代码,与阻塞模式不同的地方 LOCK_NB (如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB)

代码:

 public function index(){
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
$stock = $this->findStock();
if($stock > ){
$this->setDec();
}else{
return '抢购失败';
}
$this->setDec();
return $stock;
flock($fp,LOCK_UN);
}
else
{
echo "抢购失败,要不再试试";
} fclose($fp);
}

总结:

1.相比阻塞模式的时间等待,非阻塞模式则更加人性化很多

2.如果有有很多人都进入抢购,人太多就会直接进入第二个动作(“抢购失败界面”)。部分人就会进入第一个动作(“抢购候选名单”), 下一个步骤1.抢购成功 或者2 抢购失败

最新文章

  1. windows 安装MySql
  2. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
  3. 一步一步实现MVC5+EF6+Bootstarp+Autofac+NoSql实现OADemo 之登陆(一) 验证码 Captcha 之大插件小用
  4. (9)UI(容器)
  5. centos 升级GCC/G++
  6. 使用JAVA对字符串进行DES加密解密(修正问题)
  7. rest的config
  8. UIWebView 与 JS 交互(1):Objective-C 调用 Javascript
  9. HTTPS的学习总结
  10. Python 函数基础、有序集合、文件操作(三)
  11. HDU - 3966 Aragorn's Story(树链剖分入门+线段树)
  12. [置顶] 基于FPGA的VGA简易显存设计&NIOS ii软核接入
  13. Jquery入门(初学者易懂)
  14. poj2182(线段树求序列第k小)
  15. Spring基础系列-容器启动流程(2)
  16. Eclipse Unhandled event loop exception GC overhead limit exceeded
  17. python os.path.dirname()
  18. 本地MySQL的root所创建用户登录发生[Access denied for user 'root1'@'localhost' (using password: YES)]错误的解决方案
  19. 关于StringUtils的常用方法
  20. SQL:四舍五入和截取

热门文章

  1. redis集群主流架构方案分析
  2. regsvr32.exe是什么东西
  3. 自定义kafka Sink
  4. MAC OSX 10.10 下启用自带的Apache的rewrite模块
  5. DLL中导出函数的两种方式(dllexport与.def文件)
  6. ListView@常用属性记录
  7. UEFI Protocol
  8. awk的替代先sort 再uniq -c 再sort ,uniq只能队相邻的起作用sort先让之间相邻再sort,最后sort是数量排序
  9. druid的配置
  10. SQL Server 2012 books