阻塞模式与非阻塞模式并发数小于500,超过了会造成网站非常的不流畅,小于的话还可以接受
测试环境:thinkphp5.0+wamp
阻塞模式
结构代码:
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 > 0){
$this->setDec();
}else{
return '抢购失败';
}
return $stock;
flock($fp,LOCK_UN);
}
fclose($fp);
}
/**
* 查询数据库库存
* */
public function findStock(){
$res = db('info')->where('id',1)->field('stock')->lock(true)->find();
return $res['stock'];
}
/**
* 减少库存操作
* */
public function setDec(){
$res = db('info')->where('id',1)->setDec('stock',1);
return $res;
}
}
总结有点:1.可以解决并发问题,库存为负数的情况。
2.并发时大家都会在等待。当处理并发结束后,大家才会获得跳转(这也是缺点,如果处理1000条并发,需要时间15s,那么所有参加的人都需要等待15s后才进入下一个页面)
数据库

并发测试工具
咨询请加群:101766150
thinkphp解决并发详解一:阻塞模式
http://www.thinkphp.cn/code/2984.html
thinkphp解决并发详解二:非阻塞模式
http://www.thinkphp.cn/code/2986.html