php 实现锁
PHP 实现锁的常见方法
文件锁(flock)
利用 flock 函数对文件进行独占锁定,适用于单机环境。

$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
// 执行临界区代码
flock($fp, LOCK_UN); // 释放锁
} else {
echo "获取锁失败";
}
fclose($fp);
MySQL 悲观锁
通过数据库的 SELECT ... FOR UPDATE 实现行级锁,适用于分布式环境。

$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = ? FOR UPDATE");
$stmt->execute([$id]);
// 执行临界区操作
$pdo->commit(); // 事务提交后自动释放锁
Redis 分布式锁
利用 Redis 的 SETNX 命令实现分布式锁,需注意设置超时时间避免死锁。
$redis = new Redis();
$redis->connect('127.0.0.1');
$lockKey = 'resource_lock';
$expire = 10; // 锁超时时间(秒)
if ($redis->set($lockKey, 1, ['NX', 'EX' => $expire])) {
// 获取锁成功
// 执行临界区代码
$redis->del($lockKey); // 释放锁
} else {
echo "获取锁失败";
}
PHP 信号量(Semaphore)
使用 sem_acquire 和 sem_release 实现系统级信号量锁。
$semKey = ftok(__FILE__, 't');
$semId = sem_get($semKey);
if (sem_acquire($semId)) {
// 执行临界区代码
sem_release($semId);
}
注意事项
- 文件锁仅适用于单机环境,性能较低
- 数据库锁可能影响并发性能,需合理设计事务范围
- Redis 分布式锁需处理锁续期和原子性释放问题
- 信号量需要系统支持,Windows 环境下可能不可用
选择锁机制时应根据实际场景(单机/分布式)、性能要求和数据一致性需求进行权衡。






