php写定时器–定时执行
public function doTime(){
ignore_user_abort(true);//设为true浏览器关闭后继续执行
set_time_limit(0);//设置执行时间,单位是秒。0表示不限制。
date_default_timezone_set('PRC'); // 切换到中国的时间
$run_time = strtotime(date('Y-m-d 7:30:00',strtotime('+1 day'))); // 定时任务第一次执行的时间是明天的这个时候
$interval = 3600*24; // 每24个小时执行一次
do {
$gmt_time = microtime(true); // 当前的运行时间,精确到0.0001秒
$loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 这里处理是为了确定还要等多久才开始第一次执行任务,$loop就是要等多久才执行的时间间隔
$loop = $loop > 0 ? $loop : 0;
// if(!$loop) break; // 如果循环的间隔为零,则停止
sleep($loop);
$str=date('Y-m-d H:i:s',time())."执行\r\n";
file_put_contents(ROOT_PATH.'public/timing/'.date('Y-m-d').'.txt',$str,FILE_APPEND);//写入文件
/**
*逻辑代码
**/
$loop = $interval;
} while(true);
}
可能还有需要改进的地方,后期发现了再补充,嘻嘻。。
2020.9.5补充:
设置定时24小时后执行,只执行了当天一次,以后就不执行了,看日志定时器也在运行,但是中间的逻辑代码不走了,调试了很长时间,得出的结果有可能是24小时运行一次时间太长,改为两分钟运行一次,将当前时间存入表中,然后用设定好的时间做判断,上代码
ignore_user_abort(true);//浏览器关闭后继续执行
set_time_limit(0);//设置执行时间,单位是秒。0表示不限制。
date_default_timezone_set('PRC'); // 切换到中国的时间
$interval = 120;
do {
$wdata = db("time_set")->find(1);
$nowdata = date("Y-m-d",time());
//开始-时间点
$begin = strtotime(date("Y-m-d 21:30:00",time()));
$str=date('Y-m-d H:i:s',time())."执行循环--- ".$wdata['t_date']." --".$nowdata."---".$begin."--".time()."-分割线\r\n";
file_put_contents(ROOT_PATH.'public/timing/'.date('Y-m-d').'.txt',$str,FILE_APPEND);//写入文件
if(strtotime($nowdata)>strtotime($wdata['t_date']) && time()>$begin ){
$str=date('Y-m-d H:i:s',time())."进入条件执行-----------分割线\r\n";
file_put_contents(ROOT_PATH.'public/timing/'.date('Y-m-d').'.txt',$str,FILE_APPEND);//写入文件
db("time_set")->where("t_id",'1')->update(['t_date'=>date('Y-m-d',time()),'t_createtime'=>time()]);
file_put_contents(ROOT_PATH.'public/timing/'.date('Y-m-d').'.txt',"执行sql语句".db("time_set")->getLastSql(),FILE_APPEND);//写入文件
}
sleep($interval);
} while(true);