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 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
PHP内核介绍及扩展开发指南―基础知识
Sep 11 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
php像数组一样存取和修改字符串字符
Mar 21 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
PHP会话处理的10个函数
Aug 11 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
PHP中PDO事务处理操作示例
May 02 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
PHP数组访问常用方法解析
Sep 05 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
PHP Stream_*系列函数
2010/08/01 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
JavaScript获取按钮所在form表单id的方法
2015/04/02 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
python db类用法说明
2020/07/07 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
盛大笔试题
2016/11/05 面试题
学生会竞选演讲稿学习部
2014/08/25 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
先进班集体事迹材料
2014/12/25 职场文书
大学生自荐材料范文
2014/12/30 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
求职推荐信范文
2015/03/27 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS