php 锁 三种实现
PHP 锁的三种实现方式
文件锁(flock)
使用 flock() 函数对文件进行锁定,适用于单机环境。
$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 独占锁
// 临界区代码
flock($fp, LOCK_UN); // 释放锁
} else {
echo "无法获取锁";
}
fclose($fp);
文件锁的优点是实现简单,缺点是性能较低且不适合分布式环境。

MySQL 锁
通过数据库的 GET_LOCK() 和 RELEASE_LOCK() 函数实现。
$conn = new mysqli("localhost", "user", "pass", "db");
$lockName = "my_lock";
$timeout = 10; // 秒
// 获取锁
$result = $conn->query("SELECT GET_LOCK('$lockName', $timeout)");
if ($result->fetch_row()[0] == 1) {
// 临界区代码
$conn->query("SELECT RELEASE_LOCK('$lockName')");
} else {
echo "获取锁超时";
}
MySQL 锁适合已有 MySQL 环境的项目,支持跨进程和分布式锁定。

Redis 锁
使用 Redis 的 SETNX 命令实现分布式锁。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'resource_lock';
$lockExpire = 30; // 秒
// 尝试获取锁
$isLocked = $redis->set($lockKey, 1, ['nx', 'ex' => $lockExpire]);
if ($isLocked) {
// 临界区代码
$redis->del($lockKey); // 释放锁
} else {
echo "资源被锁定";
}
Redis 锁性能高,适合分布式系统,但需要考虑锁过期和续期问题。
选择建议
- 单机简单应用:文件锁
- 已有 MySQL 环境:MySQL 锁
- 高性能分布式系统:Redis 锁
每种方案都有适用场景,需根据具体需求选择。






