thinkphp并发 阻塞模式与非阻塞模式

结构代码php

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文件上 "独占锁",上锁成功后就能够进行下一步"处理订单商品数据了"app

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

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

 

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

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

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

 

详细代码io

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后才进入下一个页面)

 

非阻塞模式

结构代码,与阻塞模式不一样的地方 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 > 0){
                $this->setDec();
            }else{
                return '抢购失败';
            }
            $this->setDec();
            return $stock;
            flock($fp,LOCK_UN);
        }
        else
        {
            echo "抢购失败,要再也不试试";
        }

        fclose($fp);
    }

 

总结:

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

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

相关文章
相关标签/搜索