php 实现文件锁
使用 flock 函数实现文件锁
PHP 中可以使用 flock 函数来实现文件锁机制,该函数对文件进行锁定,防止多进程同时操作同一个文件导致数据冲突。
基本语法:
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
$operation 参数可选值:
LOCK_SH共享锁(读锁)LOCK_EX排他锁(写锁)LOCK_UN释放锁LOCK_NB非阻塞模式(可与前三个值组合使用)
排他锁示例
$fp = fopen("test.txt", "r+");
// 获取排他锁(阻塞模式)
if (flock($fp, LOCK_EX)) {
fwrite($fp, "Write something here\n");
// 释放锁
flock($fp, LOCK_UN);
} else {
echo "无法获取锁!";
}
fclose($fp);
共享锁示例
$fp = fopen("test.txt", "r");
// 获取共享锁
if (flock($fp, LOCK_SH)) {
echo fread($fp, filesize("test.txt"));
flock($fp, LOCK_UN);
}
fclose($fp);
非阻塞模式
$fp = fopen("test.txt", "w");
// 尝试获取非阻塞排他锁
if (flock($fp, LOCK_EX | LOCK_NB)) {
fwrite($fp, "Data\n");
flock($fp, LOCK_UN);
} else {
echo "文件正被其他进程锁定";
}
fclose($fp);
注意事项
文件锁只在同一台服务器上有效,不同服务器间的进程无法通过这种方式同步。对于分布式系统,需要考虑其他锁机制如Redis锁或数据库锁。
文件锁会在文件关闭时自动释放,但显式调用LOCK_UN释放锁是更好的做法。
Windows系统上,锁是强制性的,其他进程无法访问被锁文件。Unix/Linux系统上,锁是建议性的,其他进程仍可访问文件但应遵守锁协议。







