场景:需要实时处理redis队列消息
使用linux中的contab定时任务每隔一分钟执行一次,为防止一分钟后该脚本还没执行完,下个脚本重复执行,使用flock锁的方式
crontab -e
添加如下内容
*/1 * * * * flock -xw 60 /tmp/mytest.lock -c 'php /www/index.php'
独占锁+等待时间60秒是防止后面进程一直堆积(个人理解不一定正确)
flock:
-
-s, --shared: 获得一个共享锁
-
-x, --exclusive: 获得一个独占锁
-
-u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-
-n, --nonblock: 如果没有立即获得锁,直接失败而不是等待
-
-w, --timeout: 如果没有立即获得锁,等待指定时间
-
-o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-
-c, --command: 在shell中运行一个单独的命令
-
-h, --help 显示帮助
-
-V, --version: 显示版本
执行的文件index.php里的内容(判断脚本执行的时间超过60秒就结束,这样下个等待中的进程就可以继续执行,实现无缝执行):
$start = time();
while(1){
$file = file_get_contents('D:/abc.txt');
$file .= "\r\n".date("Y-m-d H:i:s");
file_put_contents('D:/abc.txt',$file);
sleep(1);
$end = time();
if(($end-$start)>=60){
exit;
}
}