php实现锁
PHP 实现锁的方法
在 PHP 中,锁机制用于控制并发访问共享资源,避免数据竞争和一致性问题。以下是几种常见的实现方式:
文件锁(flock)
使用 flock 函数可以实现简单的文件锁,适用于单机环境:
$fp = fopen("lockfile.lock", "w+");
if (flock($fp, LOCK_EX)) { // 获取独占锁
// 执行临界区代码
flock($fp, LOCK_UN); // 释放锁
} else {
echo "无法获取锁";
}
fclose($fp);
MySQL 锁
通过数据库实现锁,适用于分布式环境:
// 获取 MySQL 行锁
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM table WHERE id = ? FOR UPDATE");
$stmt->execute([$id]);
// 执行临界区代码
$pdo->commit();
Redis 锁
利用 Redis 的原子操作实现分布式锁:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$lockKey = 'resource_lock';
$token = uniqid();
$expire = 10; // 秒
// 尝试获取锁
if ($redis->set($lockKey, $token, ['NX', 'EX' => $expire])) {
try {
// 执行临界区代码
} finally {
// 确保只释放自己的锁
if ($redis->get($lockKey) == $token) {
$redis->del($lockKey);
}
}
} else {
echo "获取锁失败";
}
Semaphore 扩展
使用 sysvsem 扩展实现系统信号量:
$semKey = ftok(__FILE__, 't');
$semId = sem_get($semKey, 1, 0666, 1);
if (sem_acquire($semId)) {
// 执行临界区代码
sem_release($semId);
}
选择建议
- 单机环境:文件锁或 Semaphore
- 分布式环境:Redis 锁或 MySQL 锁
- 简单场景:文件锁
- 高性能需求:Redis 锁
注意实现锁时要考虑死锁预防、锁超时和异常处理等问题。






