php实现文件锁定
文件锁定的概念
文件锁定是一种机制,用于防止多个进程或线程同时访问同一文件时产生冲突。在PHP中,可以通过flock()函数实现文件锁定,支持共享锁(读锁)和独占锁(写锁)。

使用flock()函数实现文件锁定
flock()函数的语法如下:
bool flock(resource $handle, int $operation [, int &$would_block])
$handle: 文件资源句柄,通过fopen()打开的文件。$operation: 锁定类型,常用值包括:LOCK_SH: 共享锁(读锁),其他进程可读但不可写。LOCK_EX: 独占锁(写锁),其他进程不可读写。LOCK_UN: 释放锁。LOCK_NB: 非阻塞模式(可与LOCK_SH或LOCK_EX组合使用)。
$would_block: 可选参数,非阻塞模式下若锁定失败会设置为1。
示例代码:独占锁(写锁)
$file = fopen("example.txt", "c+");
if (flock($file, LOCK_EX)) { // 获取独占锁
fwrite($file, "写入内容");
flock($file, LOCK_UN); // 释放锁
} else {
echo "无法锁定文件";
}
fclose($file);
示例代码:共享锁(读锁)
$file = fopen("example.txt", "r");
if (flock($file, LOCK_SH)) { // 获取共享锁
$content = fread($file, filesize("example.txt"));
flock($file, LOCK_UN); // 释放锁
} else {
echo "无法锁定文件";
}
fclose($file);
非阻塞模式
通过LOCK_NB避免进程阻塞:
$file = fopen("example.txt", "c+");
if (flock($file, LOCK_EX | LOCK_NB)) { // 非阻塞独占锁
fwrite($file, "新内容");
flock($file, LOCK_UN);
} else {
echo "文件被其他进程占用";
}
fclose($file);
注意事项
- 文件锁定是建议性的,依赖进程主动检查锁状态。
flock()在部分NFS(网络文件系统)中可能不可靠。- 锁定后需显式调用
LOCK_UN释放锁,否则文件可能一直被锁定。 - 确保在锁定后关闭文件句柄(
fclose()),避免资源泄漏。
通过合理使用flock(),可以有效避免多进程或并发场景下的文件冲突问题。







