php怎么做定时任务

定时任务,顾名思义,到点干活.按照这个思路,我们往下走:

  1. 怎么让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);

    友情提示,千万别把这段粘贴就执行,千万别执行,后面会讲原因.如果手快执行了,重启服务器可以停止这个进程

  2. 大家都知道php是单线程的,这边死循环了,其他的页面方法都会被阻塞不能访问.具体原因我记不太清,大体意思是,第一个操作session的进程锁定,导致其他请求阻塞,所以我们要解锁

    session_write_close();           //session解锁

  3. 虽说是死循环,但也不能让它跑到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 '定时任务暂停';

        }

    }

  4. 最后,怎么样调用这个方法.我是做成一个开关,控制这个定时任务的起停,接着上代码

    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]);

        }

    }

代码粘贴到这里,如果你使用得过程中碰到解决不了的问题,欢迎留言

发表评论