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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
phpMyAdmin下载、安装和使用入门教程
May 31 PHP
php下过滤HTML代码的函数
Dec 10 PHP
PHP 读取文件的正确方法
Apr 29 PHP
PHP类的使用 实例代码讲解
Dec 28 PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
PHP时间和日期函数详解
May 08 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
php中加密解密DES类的简单使用方法示例
Mar 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
php.ini中文版
2006/10/09 PHP
深入解析php模板技术原理【一】
2008/01/10 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
浅谈php自定义错误日志
2015/02/13 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
layui table数据修改的回显方法
2019/09/04 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
python开发中range()函数用法实例分析
2015/11/12 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
软件测试企业面试试卷
2016/07/13 面试题
九年级体育教学反思
2014/01/23 职场文书
有关打架的检讨书
2014/01/25 职场文书
小学校本培训方案
2014/06/06 职场文书
驾驶员安全责任书
2014/07/22 职场文书
军训个人总结
2015/03/03 职场文书
歌舞青春观后感
2015/06/10 职场文书
画展观后感
2015/06/17 职场文书
团支部书记竞选稿
2015/11/21 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python