结构代码

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 抢购失败

thinkphp并发 阻塞模式与非阻塞模式的更多相关文章

  1. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  2. 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

    五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O 五种I/O 模式:[1]        阻塞 I/O          ...

  3. Linux下同步模式、异步模式、阻塞调用、非阻塞调用总结

    转自:http://www.360doc.com/content/13/0117/12/5073814_260691714.shtml 同步和异步:与消息的通知机制有关. 本质区别 现实例子 同步模式 ...

  4. stm32中阻塞模式和非阻塞模式 in blocking mode 与 in non-blocking mode区别

    阻塞模式和非阻塞模式...... 我的理解是:阻塞模式就像是一个延时函数,当这个函数没处理完那么,所有的按照流程需要执行的代码都不会被执行,要等到这个延时完成,类似 平时看书上写的LED灯闪烁,用的d ...

  5. 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

    完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...

  6. 29、Java并发性和多线程-非阻塞算法

    以下内容转自http://ifeve.com/non-blocking-algorithms/: 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在 ...

  7. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  8. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...

  9. java阻塞队列与非阻塞队列

    在并发编程中,有时候需要使用线程安全的队列.如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法. //使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入 ...

  10. 事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool

    一.事件驱动 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在需要等待 ...

随机推荐

  1. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  2. nginx封ip,禁用IP段的设置说明

    nginx的ngx_http_access_module 模块可以封配置内的ip或者ip段,语法如下: deny IP; deny subnet; allow IP; allow subnet; # ...

  3. [note]What I’ve learnt from working on startups

    What I've learnt from working on startups 从失败里学到了什么,六次创业失败. 企业家不是与生俱来的,也是靠学来的. 想的太多,做的太少.

  4. android 中使用jwt token(json web token)--java

    http://blog.csdn.net/mingzhnglei/article/details/51119836 下面贴上自己项目中的一个小小的example import com.nimbusds ...

  5. nfs挂载hdfs,实现云存储

    本来不知道nfs是啥,因为群里的Harry童鞋有个问题,如何把本地目录挂载到hdfs上,搞什么云存储,说那么巧就是那么巧,HDP支持nfs,然后我就照着文档的说明去做,最后弄出来了. 1.修改机器上的 ...

  6. linq操作符:分组操作符

    分组是根据一个特定的值将序列中的元素进行分组.LINQ只包含一个分组操作符:GroupBy.GroupBy操作符类似于T-SQL语言中的Group By语句.来看看GroupBy的方法定义: publ ...

  7. json转实体,json转List实体,json转泛型实体

    1.========================= https://segmentfault.com/a/1190000009523164 package com.thunisoft.maybee ...

  8. 再谈git的http服务-权限控制gitweb版(未成功)

    截至目前,对gitweb的掌握还没达到最终目标,仅仅实现了通过浏览器来浏览项目,通过git命令仍然未能clone项目.但仍然要记录下来,主要是因为打算暂时放弃这条路,而所收获的一些经验还是要记录下来. ...

  9. Altium Designer 规则设置

    设计规则设置 Designer Rules Check(DRC) Electrical 电气规则.安全间距,线网连接等 Routing 布线,线宽.过孔形状尺寸.布线拓扑.布线层.封装出线等 SMT ...

  10. 微信小程序——button, swiper等默认样式更改

    微信开发工具里面,无法展示编译后的一些样式,如::before,::after这些伪类.有时候我们需要修改一些组件的默认样式会略感到麻烦,因为不知道是通过哪里控制的. 我就平常遇到的一些修改默认样式, ...