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 相关文章推荐
php radio 单选框获取与保持值的实现代码
May 15 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
PHP5 的对象赋值机制介绍
Aug 02 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
php中session过期时间设置及session回收机制介绍
May 05 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
PHP面向对象精要总结
Nov 07 PHP
教你识别简单的免查杀PHP后门
Sep 13 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
php 使用 __call实现重载功能示例
Nov 18 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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
php实例化一个类的具体方法
2019/09/19 PHP
laravel model 两表联查示例
2019/10/24 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
RequireJS用法简单示例
2018/08/20 Javascript
vue 实现左右拖拽元素并且不超过他的父元素的宽度
2018/11/30 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
python修改字典内key对应值的方法
2015/07/11 Python
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
python学生信息管理系统(完整版)
2020/04/05 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
解析python实现Lasso回归
2019/09/11 Python
Django Form设置文本框为readonly操作
2020/07/03 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
2015年政府采购工作总结
2015/05/21 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书