深化文件锁理论flock—便携咨询文件锁描述参数handle文件系统指针,一般由fopen创建()资源(资源)。operationoperation可以是下列值之一:LOCK_SH获取共享锁(读取程序)。LOCK_EX获取独占锁(写入的程序。LOCK_UN释放锁(无论是共享锁还是独占锁)。LOCK_NB如果您不希望flock()在锁定时阻塞(Windows尚不支持)。如果锁会阻塞,则会阻塞块(EWOULDBLOCK如果出现错误代码),可选的第三个参数将设置为TRUE。(在Windows上不支持)成功时返回TRUE,失败时返回FALSE。示例$fp=fopen("lock.txt","w+");//'w+'_open读写,将文件指针指向文件头,将文件大小截断为0,如果文件不存在,尝试创建。//lockif(flock($fp,LOCK_EX|LOCK_NB)){//非阻塞模式//执行业务逻辑$res=1;//解锁羊群($fp,LOCK_UN);}else{//其他进程不解锁执行}//释放内存,减少502发生unset($res);$res=空;fclose($fp);$fp=fopen("lock.txt","w+");//lockif(flock($fp,LOCK_EX)){//阻塞模式//执行业务逻辑$res=1;//解锁flock($fp,LOCK_UN);}//当前进程会等待其他进程解锁文件然后继续执行//TODOecho"文件解锁后才能输出";//释放内存,减少502unset($res)的出现;$res=空;fclose($fp);优化方案减少“Oversold”有几种优化方案1:设置库存字段属性为无符号(unsigned),库存为0,不会出现负数2:使用mysql事务(锁定一行)select**...forupdate//锁定一行,其他操作将被阻塞,直到锁定的行被提交。其实有性能问题,阻塞时间长,如图3:redis队列(推荐)高并发下的lpop、lpush、llenmysql事务性能下降很多强大,文件锁也是,因为执行Redis的所有单个命令都是原子的,要么全部执行,要么都不执行。注意,使用redis做缓存时,更新商品库存时建议使用hincrby。例如:$num=0-$goodsNum;$inventoryNum=$redisObj->hincrby($key,'num',$num);同样,mysql做同样的减法操作4:使用php文件锁(阻塞/非阻塞模式)5:Redis锁处理(推荐)setmodesetnxmodesetnx+getset方式
