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 相关文章推荐
基于mysql的bbs设计(五)
Oct 09 PHP
用PHP进行MySQL删除记录操作代码
Jun 07 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php有道翻译api调用方法实例
Dec 22 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
Thinkphp单字母函数使用指南
May 08 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
Dec 09 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 PHP
一次项目中Thinkphp绕过禁用函数的实战记录
Nov 17 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
JAVA/JSP学习系列之七
2006/10/09 PHP
学习php笔记 字符串处理
2010/10/19 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
python实现词法分析器
2019/01/31 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
日本食品网上商店:JaponShop.com
2017/11/28 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
乔迁宴答谢词
2014/01/21 职场文书
会计专业自我评价
2014/02/12 职场文书
后备干部考察材料
2014/02/12 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
法人代表证明书格式
2014/10/01 职场文书
基于Redis延迟队列的实现代码
2021/05/13 Redis