PHP使用文件锁解决高并发问题示例


Posted in PHP onMarch 29, 2018

本文实例讲述了PHP使用文件锁解决高并发问题。分享给大家供大家参考,具体如下:

新建一个.txt文件,文件中什么都不用写。

【一】.阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程会一直等其他进程解锁文件)

<?php
//连接数据库
$con=mysqli_connect("192.168.2.186","root","root","test");
//查询商品数量是否大于0,大于0才能下单,并减少库存
$fp = fopen("lock.txt", "r");
//加锁
if(flock($fp,LOCK_EX))
{
  $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
  if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');}
  //执行完成解锁
  flock($fp,LOCK_UN);
}
//关闭文件
fclose($fp);
unset($res);
mysqli_close($con);
?>

【二】.非阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程不会等其他进程解锁文件直接返回)

<?php
//连接数据库
$con=mysqli_connect("192.168.2.186","root","root","test");
//查询商品数量是否大于0,大于0才能下单,并减少库存
$fp = fopen("lock.txt", "r");
//加锁
if(flock($fp,LOCK_EX | LOCK_NB))
{
  $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1'));
  if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');}
  //执行完成解锁
  flock($fp,LOCK_UN);
}
//关闭文件
fclose($fp);
unset($res);
mysqli_close($con);
?>

如果连接数据库费时间的话,下面有个简单的小demo,可以更直观的理解下。

demo.php

<?php
$fp = fopen("file_lock.txt", "r");
// 加锁
if(flock($fp, LOCK_EX))
{
  sleep(10);
  echo 1;
  //执行完成解锁
  flock($fp,LOCK_UN);
} else {
  echo 2;
}
//关闭文件
fclose($fp);

demo2.php

<?php
$fp = fopen("file_lock.txt", "r");
// 加锁(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php会直接返回2,否则会等待demo.php执行完返回1)
if(flock($fp, LOCK_EX))
{
  echo 1;
} else {
  echo 2;
}
//关闭文件
fclose($fp);

同时运行两个文件,然后修改demo2中加锁机制,就可以看出来阻塞(等待)模式和非阻塞(等待)模式的区别了。

但是这样会导致队列堵塞,假如10个人同一秒写入数据库,那就堵塞了,第10个人会等待前9个都执行完才会执行!

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP分页显示制作详细讲解
Oct 09 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
PHP中其实也可以用方法链
Nov 10 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
PHP解码unicode编码的中文字符代码分享
Aug 13 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
Dec 25 PHP
浅谈php+phpStorm+xdebug配置方法
Sep 17 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
phpinfo无法显示的原因及解决办法
Feb 15 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
tp5使用layui实现多个图片上传(带附件选择)的方法实例
Nov 17 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 #PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 #PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
Mar 15 #PHP
laravel框架关于搜索功能的实现
Mar 15 #PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 #PHP
PHP实现生成推广海报的方法详解
Mar 14 #PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 #PHP
You might like
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
自动更新作用
2006/10/08 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
Node.js学习入门
2017/01/03 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
JSONP跨域请求
2017/03/02 Javascript
js实现自动图片轮播代码
2017/03/22 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
详解webpack 入门与解析
2018/04/09 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
React实现轮播效果
2020/08/25 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
python实现图片筛选程序
2018/10/24 Python
Python简单I/O操作示例
2019/03/18 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
深入了解Django View(视图系统)
2019/07/23 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
企业道德讲堂实施方案
2014/03/19 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
golang使用map实现去除重复数组
2022/04/14 Golang