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