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 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
php操作mysql数据库的基本类代码
Feb 25 PHP
CI框架中zip类应用示例
Jun 17 PHP
给ECShop添加最新评论
Jan 07 PHP
php绘制一条弧线的方法
Jan 24 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 PHP
PHP接入微信H5支付的方法示例
Oct 28 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变量存储的详解
2013/06/13 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Python中字符串的处理技巧分享
2016/09/17 Python
Linux下python3.7.0安装教程
2018/07/30 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
Python 实现简单的客户端认证
2020/07/29 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
Python 多进程原理及实现
2020/12/21 Python
python中pickle模块浅析
2020/12/29 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
出国留学自荐信
2013/10/25 职场文书
营销与策划专业毕业生求职信
2013/11/01 职场文书
采购主管工作职责
2013/12/12 职场文书
应届电子商务毕业自荐书范文
2014/02/11 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python