php的咨询文件锁定:flock
最近因为工作的需要在研究php,碰到了一个问题,我使用如下代码锁定一个文件句柄
[php]
$filename = "/tmp/lock.txt";
$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
sleep(20);
$count = (int)fgets($fp);
$count += 1;
fseek($fp, 0);
fwrite($fp, (string)$count);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
$filename = "/tmp/lock.txt";
$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
sleep(20);
$count = (int)fgets($fp);
$count += 1;
fseek($fp, 0);
fwrite($fp, (string)$count);
fflush($fp); // flush output before releasing the lock
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
访问,然后在sleep的20秒内尝试使用vi编辑/tmp/lock.txt,发现可以成功修改文件内容而不需要等待第一个脚本结束。经琢磨文档,发现这里有个概念叫"咨询文件锁定",就是说所有访问程序必须使用同一方式锁定才会生效, 否则它不会工作。
尝试使用如下代码在20秒内访问:
[php]
$filename = "/tmp/lock.txt";
$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
$count = (int)fgets($fp);
echo $count;
$count += 1;
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
$filename = "/tmp/lock.txt";
$fp = fopen($filename, "r+");
if (!$fp) {
die("open failed.");
}
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
$count = (int)fgets($fp);
echo $count;
$count += 1;
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
发现阻塞成功(第二个脚本需要等待第一个脚本结束才能继续运行)。
那么,什么叫同一种方式锁定呢?
A组:
1.尝试脚本1的flock参数修改为LOCK_SH,脚本2不变,试验,发现阻塞依然成功;
2.尝试脚本1和脚本2的flock参数都修改为LOCK_SH,发现脚本2会可以返回结果而不用等待脚本1执行结束;
B组:
1.尝试将脚本2的fopen参数修改为"r",现象同A组;
C组:
1.尝试将脚本2的flock参数修改为LOCK_SH,脚本1不变。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写
