PHP中文件锁定 flock() 函数

flock — 轻便的咨询文件锁定

说明

flock ( resource $handle , int $operation [, int &$wouldblock ] ) : bool

 

flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。

在 PHP 5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会自动调用)。

PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。 默认情况下,这个函数会阻塞到获取锁;这可以通过下面文档中 LOCK_NB 选项来控制(在非 Windows 平台上)。


参数
handle
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。

operation
operation 可以是以下值之一:

LOCK_SH 取得共享锁定(读取的程序)。
LOCK_EX 取得独占锁定(写入的程序。
LOCK_UN 释放锁定(无论共享或独占)。
如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持)。

wouldblock
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为 TRUE。(Windows 上不支持)


这个函数一般用来处理并发事件的

例子1

复制代码
$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
/**
*这写需要执行的代码
**/
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't get the lock!";
}

fclose($fp);
复制代码

 

但是其中需要执行的代码在并发的情况下所有用户进程都会执行,这是一个大坑。
所以 flock($fp, LOCK_EX) 要加上 flock($fp, LOCK_EX|LOCK_NB) 在锁定时阻塞,才不会出现多个进程都会执行,但这样也会导致,当一个进程执行程序时其它进程直接返回失败错误。


例子2:

复制代码
<?php 
$file = "./test1.txt";
$f = fopen($file, 'a');
if(flock($f, LOCK_EX)){#上锁,因为执行的是fwrite(即写入)所以是LOCK_EX
fwrite($f, "hello world!");
}
flock($f,LOCK_UN);#释放
fclose($f);
?>
复制代码

 

posted on   zqifa  阅读(950)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2019-06-04 pacman 命令详解
2019-06-04 windows7下安装msys2

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示