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
一个ubbcode的函数,速度很快.
Oct 09 PHP
用php+mysql一个名片库程序
Oct 09 PHP
PHP教程 变量定义
Oct 23 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
php缓存技术详细总结
Aug 07 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
swoole和websocket简单聊天室开发
Nov 18 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 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
提问的智慧(2)
2006/10/09 PHP
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
Python中列表元素转为数字的方法分析
2016/06/14 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
opencv+python实现均值滤波
2020/02/19 Python
python Canny边缘检测算法的实现
2020/04/24 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
委托代理人授权委托书范本
2014/09/24 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
爱国主义教育主题班会
2015/08/13 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android