php 锁 三种实现
PHP 锁的三种实现方式
文件锁(flock)
使用 PHP 的 flock 函数对文件进行加锁,适用于单机环境。flock 支持共享锁(LOCK_SH)和独占锁(LOCK_EX)。
$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) {
// 执行需要加锁的代码
flock($fp, LOCK_UN); // 释放锁
}
fclose($fp);
数据库锁
通过数据库的 SELECT ... FOR UPDATE 或事务隔离级别实现锁机制,适用于分布式环境。
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = 1 FOR UPDATE");
$stmt->execute();
// 执行需要加锁的代码
$pdo->commit();
Redis 锁
利用 Redis 的 SETNX(或 Redlock 算法)实现分布式锁,适用于高并发场景。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'resource_lock';
$expire = 10; // 锁超时时间(秒)
if ($redis->set($lockKey, 1, ['NX', 'EX' => $expire])) {
// 执行需要加锁的代码
$redis->del($lockKey); // 释放锁
}
注意事项
- 文件锁仅适用于单机环境,性能较低。
- 数据库锁可能影响数据库性能,需合理设计事务范围。
- Redis 锁需处理锁超时和死锁问题,建议使用成熟的库(如
predis或phpredis)。







