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个都执行完才会执行!

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python 爬虫系列教程一爬取批量百度图片[通俗易懂]

    Python 爬虫系列教程一爬取批量百度图片[通俗易懂]很久之前就学习了Python的爬虫了,也用来做过一些项目(主要是一些课程项目),但时间比较紧,一直没有空把它写下来,这个暑假,我可能会逐渐更新Python爬虫的相关知识。项目1:实现批量爬取百度图片先简单的介绍下这个项目。当你需要下载大量图片的时候,或许你会去百度图片里一张张右键下载,但这样未免太麻烦了,有了这个工具,你直接运行下程序,输入你想要下载图片的关键字,然后输入你想要下载图片的数…

    2022年5月3日
    117
  • 【2022最新Java面试宝典】—— SpringBoot面试题(44道含答案)

    【2022最新Java面试宝典】—— SpringBoot面试题(44道含答案)目录1.什么是SpringBoot?2.为什么要用SpringBoot3.SpringBoot与SpringCloud区别4.SpringBoot有哪些优点?5.SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?6.SpringBoot支持哪些日志框架?推荐和默认的日志框架是哪个?7.SpringBootStarter的工作原理8.SpringBoot2.X有什么新特性?与1.X有什么区别?9.SpringBoot支持什么前端模板,10.Spr

    2022年7月15日
    48
  • Memwatch使用说明

    Memwatch使用说明linux下的测试工具真是少之又少,还不好用,最近试用了memwatch,感觉网上的介绍不太好,所以放在这里跟大家分享 。其实大部分都是看的帮助,很多地方翻译得不好还有错,请原谅指出最好看原文。如果转载或引用,请注明我的博客地址,谢谢。 1介绍MemWatch由 Johan Lindh 编写,是一个开放源代码 C 语言内存错误检测工具。MemWatch支持 ANSI C,它提供结果日志纪录

    2022年7月13日
    21
  • 行列式的几何意义,计算公式_n阶行列式几何意义

    行列式的几何意义,计算公式_n阶行列式几何意义近期回顾了下行列式的计算方法,以及其几何意义,本文是作者的一点浅薄理解。欢迎朋友们一起交流。线性代数系列文章见专栏,下面是往期内容:为什么要学线性代数(点击蓝色字体进入查看)正题:每一个线性变换都对应着一个变换矩阵,被变换后的空间,相对之前来说也发生了一定的形变,而行列式的意义则是线性变换前后,空间形变的倍数。以二维空间为例,旋转变换就是一种线性变换(不了解旋转变换的请看上条推送),其对应的矩阵叫旋转矩阵:该变换作用在二维空间的任一个向量,相当于将该向量逆时针旋转θ角度,于是.

    2025年7月21日
    5
  • 【C++】智能指针详解

    【C++】智能指针详解参考资料:《C++Primer中文版第五版》我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delet…

    2022年7月11日
    30
  • 服务器为什么要封海外,UDP攻击是什么「建议收藏」

    服务器为什么要封海外,UDP攻击是什么「建议收藏」为什么要封海外:总所周知,目前国内的大攻击大多都来自海外,因为国外的攻击成本比国内会低很多,一旦发起了攻击,并不容易找到攻击的源头。国外的家用带宽能达到千M口,咱们国内的百M口,相当于一只外国肉鸡能顶我们国内好几台肉鸡,那这个量是不得了的,而且国内的网站几乎很少有国外用户访问,目前封海外是国内的一大趋势。UDP攻击是什么:UDP攻击全称:UDP淹没攻击(UDPFloodAttack)。UDP淹没攻击是导致主机拒绝服务的一种攻击,属于带宽类攻击。UDP是一种无连接的协议,不需要用任何程序建立连接..

    2022年10月2日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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