利用flock()函数对文件进行加锁(排它锁),实现并发按序进行。
flock(file,lock,block)有三个参数。
file : 已经打开的文件
lock : 锁的类型
LOCK_SH : 共享锁定(读锁)
LOCK_EX : 独占锁定(排它锁,写锁)
LOCK_UN : 解锁
LOCK_NB : 如果希望在文件锁定时阻塞进程,那么需要加上该参数
block : 设置为true的时候,锁定文件时,会阻止其他进程
下面是一个简单demo/** * 阻塞模式(后面的进程会一直等待前面的进程执行完毕) */ public function crateOrder() { $file = fopen(__DIR__."/lock.txt","w+"); //加锁 if(flock($file,LOCK_EX)) { //TODO 执行业务代码 flock($file,LOCK_UN);//解锁 } //关闭文件 fclose($file); } /** * 非阻塞模式(只要当前文件有锁存在,那么直接返回) */ public function crateOrder() { $file = fopen(__DIR__."/lock.txt","w+"); //加锁 if(flock($file,LOCK_EX|LOCK_NB)) { //TODO 执行业务代码 flock($file,LOCK_UN);//解锁 } else { //TODO 执行业务代码 返回系统繁忙等错误提示 } //关闭文件 fclose($file); }
小提示:在执行fclose()的时候文件也会自动解锁,所以可以省略解锁的代码
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/29371.html
摘要:前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用的锁来解决高并发的问题先看没有利用事务的时候并发的后果创建库存管理表创建订单管理表测试代码我们预置库存是十个,然后执行测试查看结果 前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用Mysql的锁来解决高并发的问题 先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `...
摘要:以购买商品举例从数据库获取库存的数量。这里暂时就不测试了,下面会针对并发的处理给出测试结果。第二种方案,使用的文件锁。特点当调用锁一个文件时,如果没有获取锁,直接返回,不会出现阻塞。的表锁和的文件锁在应对并发数量上也有差别,自己可以多测试。 以购买商品举例: ① 从数据库获取库存的数量。② 检查一下库存的数量是否充足。③ 库存的数量减去买家购买的数量(以每个用户购买一个为例)。④ 最后...
阅读 2724·2021-11-11 17:21
阅读 615·2021-09-23 11:22
阅读 3580·2019-08-30 15:55
阅读 1643·2019-08-29 17:15
阅读 577·2019-08-29 16:38
阅读 909·2019-08-26 11:54
阅读 2508·2019-08-26 11:53
阅读 2751·2019-08-26 10:31