PHP使用文件锁解决高并发问题示例

PHP使用文件锁解决高并发问题示例

http://www.jb51.net/article/137359.htm

 

这篇文章主要介绍了PHP使用文件锁解决高并发问题,结合实例形式分析了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个都执行完才会执行!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113364.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • excel如何合并相同项单元格内容_不能对合并单元格部分更改

    excel如何合并相同项单元格内容_不能对合并单元格部分更改工作中可能想要快速的实现将Excel相同项目单元格合并,下面就跟大家简单地介绍一下。1.如下图F列中含有很多相同项,现在我们想要将这些相同项目单元格合并。2.首选我们选中F列数据单元格区域3.点击下图选项(Excel工具箱,百度即可了解详细下载安装信息,本文这里就不做详细解说。)4.然后选择【合并转换】,【合并相同单元格】5.勾选【列方向】6.最后点击【确定】即可完成7完成效果如下图所示

  • Canny边缘检测及C++实现「建议收藏」

    Canny边缘检测及C++实现「建议收藏」Canny边缘检测算法是澳大利亚科学家JohnF.Canny在1986年提出来的,不得不提一下的是当年JohnCanny本人才28岁!到今天已经30年过去了,Canny算法仍然是图像边缘检测算法中最经典有效的算法之一。一起睹一下大家芳容:JohnCanny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的3个指标:1 好的信噪比,即将非边缘点判定为

  • 登录mysql数据库的几种方式

    登录mysql数据库的几种方式登录mysql数据库的几种方式

  • gridview属性_GridView

    gridview属性_GridViewGridView在生成HTML代码的时候会自动加上style=”border-collapse:collapse;”以及border=1,rules=”all”这些属性,这些在IE下都没什么影响,但是在FF下就会影响显示,style=”border-collapse:collapse;”;是由于设置了CellSpacing=”0″产生的,当设置CellSpacing=”1″后就没有,可以去掉sty

  • keil将程序装入外部FLASH具体解释[通俗易懂]

    keil将程序装入外部FLASH具体解释

  • 485转网口的moxa(虚拟机com口和主机com口)

    影响我们一生百倍差距的四大效应观察者效应:你的世界是什么样是由你的观察决定的.这个效应是在【潜能突破】研习营课堂上发现的,我们有个练习叫三生万物,每个人都会成为一次观察者角色,当大家在成为其他角色时,他们总是发现不了自己的问题,无论我们怎样提醒都没有用,无法改变原有的模式,当他们进入观察者模式,看见其他人的行为所造成的后果时,立刻恍然大悟,主动注意自己的形为,在当下立刻发生改变.刚开始我以为这是个…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号