定时任务,顾名思义,到点干活.按照这个思路,我们往下走:
怎么让php进程一直跑下去?死循环,只有方法一直执行,我们才能判断在什么时候做什么事.直接粘贴代码
// 休眠时间
$sleep_time = 60;
// 进行休眠
sleep($sleep_time);
//调用自己
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $url);
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER, _REFERER_);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
友情提示,千万别把这段粘贴就执行,千万别执行,后面会讲原因.如果手快执行了,重启服务器可以停止这个进程
大家都知道php是单线程的,这边死循环了,其他的页面方法都会被阻塞不能访问.具体原因我记不太清,大体意思是,第一个操作session的进程锁定,导致其他请求阻塞,所以我们要解锁
session_write_close(); //session解锁
虽说是死循环,但也不能让它跑到cpu炸掉.我们要加个控制,我这里用的方法是,读取一个文件的内容,判断内容来决定循环的执行与否
public function test(){
set_time_limit(0); //不受php文件的执行时间限制
session_write_close(); //session解锁
//用于控制定时任务的死循环
$notice_task = file('./notice_task.txt')[0]; //1启用 0弃用
if (trim($notice_task) == 1) { //判断是否为1
$time = 60;
sleep($time);
//调用自己
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $url);
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER, _REFERER_);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($ch);
curl_close($ch);
} else {
echo '定时任务暂停';
}
}
最后,怎么样调用这个方法.我是做成一个开关,控制这个定时任务的起停,接着上代码
public function changeStatus(){
if(IS_AJAX){
$status = I('post.status/d');
$file_data = 0;
if($status == 1){
$file_data = 1;
}
$res = file_put_contents('./notice_task.txt',$file_data); //写入
if(!$res){
$this->ajaxReturn(['code'=>1,'msg'=>'写入失败']);
}
if($file_data){
$this->test();
$msg = '开启定时提醒功能成功!';
}else{
$msg = '关闭定时提醒功能成功!';
}
$this->ajaxReturn(['code'=>1,'msg'=>$msg]);
}
}
代码粘贴到这里,如果你使用得过程中碰到解决不了的问题,欢迎留言