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 相关文章推荐
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
将数组写入txt文件 var_export
Apr 21 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
php判断表是否存在的方法
Jun 18 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 PHP
TP5框架实现签到功能的方法分析
Apr 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
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP中list方法用法示例
2016/12/01 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
JavaScript 学习笔记(十五)
2010/01/28 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
深入理解Python中的内置常量
2017/05/20 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
安全员岗位职责
2013/11/11 职场文书
国旗下演讲稿
2014/05/08 职场文书
提档介绍信范文
2015/10/22 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
python脚本框架webpy模板赋值实现
2021/11/20 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS