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 相关文章推荐
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
Jun 23 PHP
PHP生成随机密码类分享
Jun 25 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 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在Web开发领域的优势
2006/10/09 PHP
PHP反射机制用法实例
2014/08/28 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
2015/05/25 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
vue项目中使用Svg的方法
2018/10/24 Javascript
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
2017/11/29 Python
python编程线性回归代码示例
2017/12/07 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
pandas-resample按时间聚合实例
2019/12/27 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
爱普生美国官网:Epson美国
2018/11/05 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
软件测试工程师面试问题精选
2016/10/28 面试题
婚纱店策划方案
2014/05/22 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
丧事答谢词
2015/01/05 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
音乐之声观后感
2015/06/04 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers