喜迎
春节

PHP任务加锁


在PHP中,有时候我们需要设置定时任务,同一时间只有一个任务在执行。这就需要使用互斥锁来控制,下面介绍下实现方式:

使用 flock 函数实现文件锁

以下是一个示例:

1
2
3
4
5
6
7
8
$fp = fopen('/tmp/lock.txt', 'w');
if (flock($fp, LOCK_EX | LOCK_NB)) { // 获取独占锁
// 执行任务
// ......
// 释放锁
flock($fp, LOCK_UN);
}
fclose($fp);

上面的代码使用 flock 函数获取一个文件锁,如果能成功获取到锁,则表示没有其他进程正在执行该任务,我们就可以执行该任务。执行完毕后,要记得释放锁,以便其他进程可以继续执行任务。

使用 Redis 锁等方式实现互斥

使用 Redis 实现互斥锁的方式较为常见,因为 Redis 本身就支持分布式锁。

以下是使用 Redis 实现互斥锁的示例:

1
2
3
4
5
6
7
8
9
10
$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 方法设置键的过期时间。

此外还可以使用其他方式实现互斥锁,比如数据库锁。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
Linux搜索关键词前后几行
Linux搜索关键词前后几行
Linux 命令行中的快捷键非常丰富,可以大大提高程序员的工作效率。下面将详细介绍一些常用的快捷键,并分类说明: 在工作中,经常需要在linux中根据关键词搜索日志,并获取前后几行;其实,grep 命令可以搭配 -C 或 -A 或 -B 选
2023-06-21
下一篇 
Linux中">"和">>"的区别
Linux中">"和">>"的区别
在Linux中,>符号用于将输出重定向到文件中,并会覆盖文件中原有的内容。 如果要将输出追加到文件中而不是覆盖原有内容,可以使用>>符号。 下面是两个符号的用法示例: >符号:覆盖原有内容。 1echo "Hell
2023-03-17

在PHP中,有时候我们需要设置定时任务,同一时间只有一个任务在执行。这就需要使用互斥锁来控制,下面介绍下实现方式:

使用 flock 函数实现文件锁

以下是一个示例:

1
2
3
4
5
6
7
8
$fp = fopen('/tmp/lock.txt', 'w');
if (flock($fp, LOCK_EX | LOCK_NB)) { // 获取独占锁
// 执行任务
// ......
// 释放锁
flock($fp, LOCK_UN);
}
fclose($fp);

上面的代码使用 flock 函数获取一个文件锁,如果能成功获取到锁,则表示没有其他进程正在执行该任务,我们就可以执行该任务。执行完毕后,要记得释放锁,以便其他进程可以继续执行任务。

使用 Redis 锁等方式实现互斥

使用 Redis 实现互斥锁的方式较为常见,因为 Redis 本身就支持分布式锁。

以下是使用 Redis 实现互斥锁的示例:

1
2
3
4
5
6
7
8
9
10
$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 方法设置键的过期时间。

此外还可以使用其他方式实现互斥锁,比如数据库锁。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
Linux搜索关键词前后几行
Linux搜索关键词前后几行
Linux 命令行中的快捷键非常丰富,可以大大提高程序员的工作效率。下面将详细介绍一些常用的快捷键,并分类说明: 在工作中,经常需要在linux中根据关键词搜索日志,并获取前后几行;其实,grep 命令可以搭配 -C 或 -A 或 -B 选
2023-06-21
下一篇 
Linux中">"和">>"的区别
Linux中">"和">>"的区别
在Linux中,>符号用于将输出重定向到文件中,并会覆盖文件中原有的内容。 如果要将输出追加到文件中而不是覆盖原有内容,可以使用>>符号。 下面是两个符号的用法示例: >符号:覆盖原有内容。 1echo "Hell
2023-03-17
  目录
  目录
hexo