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+oracle 分页类
Oct 09 PHP
linux下 C语言对 php 扩展
Dec 14 PHP
PHP 进程锁定问题分析研究
Nov 24 PHP
优化PHP程序的方法小结
Feb 23 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
Sep 19 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 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中Session的概念
2006/10/09 PHP
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
python脚本监控docker容器
2016/04/27 Python
python正则分析nginx的访问日志
2017/01/17 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
Python3 JSON编码解码方法详解
2019/09/06 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
培训主管的岗位职责
2013/11/23 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
五五普法心得体会
2014/09/04 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
2021/05/21 PostgreSQL
Python获取字典中某个key的value
2022/04/13 Python