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 相关文章推荐
使用MaxMind 根据IP地址对访问者定位
Oct 09 PHP
PHP 存取 MySQL 数据库的一个例子
Oct 09 PHP
PHP生成月历代码
Jun 14 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
Dec 16 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
Apr 01 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 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开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
遗传算法之Python实现代码
2017/10/10 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
施工资料员岗位职责
2014/01/06 职场文书
团购业务员岗位职责
2014/03/15 职场文书
个人总结与自我评价
2014/09/18 职场文书
超市督导岗位职责
2015/04/10 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python