我们在TP6中使用计划任务的时候,经常会因为实际的操作时长大于计划任务的周期时长,比如设置的计划任务是每一小时一次,但是实际业务时长会超过1个小时,这样进程就会一直被挂在后台,久而久之,服务器就会被这些进程占用的越来越多,导致服务器越来越卡。
这时候我们会在计划任务的类中加入以下代码
protected $fd;
public function __construct()
{
parent::__construct();
$this->fd = fopen('./runtime/PushTcCall.lock','aw');
if (!flock($this->fd,LOCK_EX|LOCK_NB)){
echo "加锁失败 进程正在执行";
exit;
}
}
这样每次去执行计划任务的时候,去初始化构造方法,构造方法里面会使用flock这个方法判断这个文件是否容许加锁,如果上一个脚本还未执行完成,说明进程正在执行,加锁会出现失败,并退出。