thinkphp解决并发详解一:阻塞模式

浏览:8083 发布日期:2017/04/06 分类:功能实现 关键字: thinkphp5 并发 阻塞 非阻塞
并发 阻塞模式 非阻塞模式
阻塞模式与非阻塞模式并发数小于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

评论( 相关
后面还有条评论,点击查看>>