php 锁 三种实现
PHP 锁的三种实现方式
文件锁(flock)
文件锁通过 flock() 函数实现,适用于单机环境下的进程同步。
$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 独占锁
// 临界区代码
flock($fp, LOCK_UN); // 释放锁
}
fclose($fp);
- 优点:简单易用,无需额外扩展。
- 缺点:仅限单机,高并发时可能因文件 I/O 成为瓶颈。
数据库锁
通过数据库的排他锁(如 MySQL 的 SELECT ... FOR UPDATE)实现。
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM resources WHERE id = 1 FOR UPDATE");
$stmt->execute();
// 临界区代码
$pdo->commit();
- 优点:适用于分布式环境,利用数据库事务特性。
- 缺点:依赖数据库性能,不当使用可能导致死锁。
Redis 锁(分布式锁)
使用 Redis 的 SETNX 或 RedLock 算法实现分布式锁。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'resource_lock';
$expire = 10; // 锁超时时间(秒)
if ($redis->set($key, 1, ['NX', 'EX' => $expire])) {
// 临界区代码
$redis->del($key); // 释放锁
}
- 优点:高性能,支持分布式系统。
- 缺点:需处理锁续期问题,避免因进程崩溃导致死锁。
选择建议
- 单机环境:优先考虑文件锁或数据库锁。
- 分布式系统:使用 Redis 锁或其他分布式锁方案(如 ZooKeeper)。
- 关键点:始终设置锁超时,避免死锁;确保锁释放逻辑在异常情况下仍能执行。







