在解决高并发的情景下,我们除了使用Redis缓存来实现外,利用文件锁也是一种常常使用的方法,下面介绍PHP是如何使用flock()函数对文件进行加锁,从而解决高并发的情况。
1.flock函数的介绍
flock有三个参数分别是:(file,lock,block)
file:已经打开的文件
lock:锁的类型
LOCK_SH:共享锁(读锁)
LOCK_EX:独占锁定(排它锁,写锁)
LOCK_UN:解锁
LOCK_NB:如果希望在文件锁定时阻塞进程,那么需要加上该参数
block:设置为true的时候,锁定文件时,会阻止其他进程
2.使用例子
例1:a使用独占锁写文件,b读取文件,阻塞
a.php
<?php
$file = 'test.txt';
$fp = fopen($file, 'w');
if(flock($fp, LOCK_EX)){
// 取得独占锁
fwrite($fp, "Hello World\r\n"); // 写入数据
sleep(10); // sleep 10秒,文件被锁定
fwrite($fp, "Hello PHP\r\n"); // 写入数据
flock($fp, LOCK_UN); // 解锁
}
fclose($fp);
?>
b.php
<?php
$file = 'test.txt';
$fp = fopen($file, 'r');
if(flock($fp, LOCK_SH)){
// 取得贡献锁
while