在PHP中,有时候我们需要设置定时任务,同一时间只有一个任务在执行。这就需要使用互斥锁来控制,下面介绍下实现方式:
使用 flock 函数实现文件锁
以下是一个示例:$fp = fopen('/tmp/lock.txt', 'w');
if (flock($fp, LOCK_EX | LOCK_NB)) { // 获取独占锁
// 执行任务
// ......
// 释放锁
flock($fp, LOCK_UN);
}
fclose($fp);
上面的代码使用 flock 函数获取一个文件锁,如果能成功获取到锁,则表示没有其他进程正在执行该任务,我们就可以执行该任务。执行完毕后,要记得释放锁,以便其他进程可以继续执行任务。
使用 Redis 锁等方式实现互斥
使用 Redis 实现互斥锁的方式较为常见,因为 Redis 本身就支持分布式锁。
以下是使用 Redis 实现互斥锁的示例:$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'task-lock';
if ($redis->setnx($key, true)) { // 尝试获取锁
$redis->expire($key, 10); // 设置锁的过期时间
// 执行任务
// ......
// 释放锁
$redis->del($key);
}
上面的代码使用 Redis 的 setnx 方法尝试获取一个锁。如果能成功获取到锁,则表示没有其他进程正在执行该任务,我们就可以执行该任务。执行完毕后,要记得删除锁以便其他进程可以继续执行任务。需要注意的是,为了避免程序异常退出而导致锁无法释放,我们需要为锁添加一个过期时间。在 Redis 中,可以使用 expire 方法设置键的过期时间。
此外还可以使用其他方式实现互斥锁,比如数据库锁。