php 锁 三种实现
文件锁(flock)
使用 flock() 函数对文件进行加锁,适用于单机环境下的进程同步。
代码示例:

$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
// 临界区代码
flock($fp, LOCK_UN); // 释放锁
} else {
echo "获取锁失败";
}
fclose($fp);
LOCK_EX为独占锁,LOCK_SH为共享锁- 注意需配合
fopen()使用,锁与文件句柄绑定
数据库锁
通过数据库事务或 SELECT FOR UPDATE 实现行级锁,适用于分布式环境。
MySQL 示例:
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = ? FOR UPDATE");
$stmt->execute([$id]);
// 临界区操作
$pdo->commit();
- InnoDB 引擎支持行锁
- 需注意事务隔离级别和死锁问题
Redis 分布式锁
利用 Redis 的 SETNX 命令实现跨进程锁,需处理锁超时问题。
代码示例:
$redis = new Redis();
$redis->connect('127.0.0.1');
$lockKey = 'resource_lock';
$token = uniqid();
$expire = 30; // 秒
if ($redis->set($lockKey, $token, ['NX', 'EX' => $expire])) {
try {
// 临界区代码
} finally {
// Lua脚本保证原子性删除
$script = 'if redis.call("GET",KEYS[1]) == ARGV[1] then return redis.call("DEL",KEYS[1]) else return 0 end';
$redis->eval($script, [$lockKey, $token], 1);
}
}
- 需设置唯一标识(
token)避免误删 - 推荐使用 Redlock 算法增强可靠性







