php 实现文件锁
PHP 实现文件锁的方法
文件锁(File Lock)是一种用于控制多个进程或线程对同一文件进行并发访问的机制。PHP 提供了几种实现文件锁的方式,主要通过 flock() 函数实现。
使用 flock() 函数实现文件锁
flock() 是 PHP 中用于文件锁的核心函数,支持共享锁(LOCK_SH)和独占锁(LOCK_EX)。
$fp = fopen("example.txt", "r+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
fwrite($fp, "写入内容");
flock($fp, LOCK_UN); // 释放锁
} else {
echo "无法获取文件锁";
}
fclose($fp);
共享锁与独占锁的区别
- LOCK_SH(共享锁):多个进程可以同时获取共享锁,适用于读操作。
- LOCK_EX(独占锁):同一时间只能有一个进程获取独占锁,适用于写操作。
$fp = fopen("example.txt", "r");
if (flock($fp, LOCK_SH)) { // 获取共享锁
$content = fread($fp, filesize("example.txt"));
flock($fp, LOCK_UN); // 释放锁
}
fclose($fp);
非阻塞锁
默认情况下,flock() 是阻塞的(即如果锁被占用,进程会等待)。可以通过 LOCK_NB 标志实现非阻塞锁。

$fp = fopen("example.txt", "r+");
if (flock($fp, LOCK_EX | LOCK_NB)) { // 非阻塞独占锁
fwrite($fp, "写入内容");
flock($fp, LOCK_UN);
} else {
echo "文件被其他进程占用";
}
fclose($fp);
文件锁的注意事项
- 文件锁是建议性锁(Advisory Lock),依赖于进程的自愿遵守。如果进程不检查锁,仍然可以直接操作文件。
flock()仅在支持锁的系统上有效(如 Linux、Windows),某些网络文件系统(如 NFS)可能不支持。- 确保在操作完成后释放锁,避免死锁。
其他实现方式
对于更复杂的并发控制,可以考虑使用数据库锁(如 MySQL 的行锁)或缓存系统(如 Redis 的分布式锁)。






