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中的this,self和parent关键字详解教程
Mar 19 PHP
CI框架Session.php源码分析
Nov 03 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
php 多文件上传的实现实例
Oct 23 PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
php数据序列化测试实例详解
Aug 12 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
PDO::quote讲解
Jan 29 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 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
dedecms系统常用术语汇总
2007/04/03 PHP
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
js实现图片轮播效果
2015/12/19 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
关于旷工的检讨书
2014/02/02 职场文书
模具专业毕业生自荐书范文
2014/02/19 职场文书
化工实习心得体会
2014/09/09 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书