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 相关文章推荐
一个可以找出源代码中所有中文的工具
Oct 25 PHP
php用户注册页面利用js进行表单验证具体实例
Oct 17 PHP
php中AES加密解密的例子小结
Feb 18 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
Sep 23 PHP
smarty简单分页的实现方法
Oct 27 PHP
PHP比较运算符的详细介绍
Sep 29 PHP
WordPress中获取指定分类及其子分类下的文章数目
Dec 31 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 PHP
PHP代码覆盖率统计详解
Jul 22 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 Pear 安装及使用
2009/03/19 PHP
php时区转换转换函数
2014/01/07 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
js异或加解密效果代码
2008/06/25 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
2015/12/30 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
vue debug 二种方法
2018/09/16 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
Python实现代码统计工具
2019/09/19 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python正则表达式实例代码
2020/03/03 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
建筑工程专业毕业生自荐信
2013/10/19 职场文书
物业管理应届生求职信
2013/10/28 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
普宁寺导游词
2015/02/04 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python