thinkphp中怎么实现后台执行任务

2022-03-10 综合 465阅读
  • ThinkPHP实现定时执行任务的两种方法

1、方法一:v3.2.1


①、ThinkPHP/Library/Behavior/CronRunBehavior.class.php文件

    在这里首先要说的就是这个自动执行任务文件,官方所给的这个文件存在BUG,我是用的是v3.2.1版本,后面的版本是否有改正大家可以尝试一下。


[php]viewplain

 

namespaceBehavior; 

  

classCronRunBehavior 

  publicfunctionrun(&$params) 

  { 

    if(C('CRON_CONFIG_ON')){ 

      $this->checkTime(); 

    } 

  } 

  

  privatefunctioncheckTime() 

  { 

    if(F('CRON_CONFIG')){ 

      $crons=F('CRON_CONFIG'); 

    }elseif(C('CRON_CONFIG')){ 

      $crons=C('CRON_CONFIG'); 

    } 

  

    if(!empty($crons)&&is_array($crons)){ 

      $update=false; 

      $log=array(); 

      foreach($cronsas$key=>$cron){ 

        if(empty($cron[2])||$_SERVER['REQUEST_TIME']>$cron[2]){ 

          G('cronStart'); 

          R($cron[0]); 

          G('cronEnd'); 

          $_useTime=G('cronStart','cronEnd',6); 

          $cron[2]=$_SERVER['REQUEST_TIME']+$cron[1]; 

          $crons[$key]=$cron; 

          $log[]='Cron:'.$key.'Runat'.date('Y-m-dH:i:s').'Use'.$_useTime.'s'."\r\n"; 

          $update=true; 

        } 

      } 

      if($update){ 

        \Think\Log::write(implode('',$log)); 

        F('CRON_CONFIG',$crons); 

      } 

    } 

  } 

    此段代码已经将bug修复,大家可以将其复制到“ThinkPHP/Library/Behavior/CronRunBehavior.class.php”文件中进行保存。

②、tgs.php

    在Application/Common/Conf文件夹中新建tags.php文件,进行标签设置。


[php]viewplain

  

returnarray( 

  //'配置项'=>'配置值' 

  'app_begin'=>array('Behavior\CronRunBehavior'), 

); 

③、config.php


    在Application/Common/Conf文件夹中的config.php文件进行自动运行配置。


[php]viewplain

returnarray( 

    

  'CRON_CONFIG_ON'=>true,//是否开启自动运行  

  'CRON_CONFIG'=>array(  

    '测试执行定时任务'=>array('Home/Index/crons','5',''),//路径(格式同R)、间隔秒(0为一直运行)、指定一个开始时间  

  ), 

); 

④、IndexController.class.php


    在Application/Home/Controller/IndexController.class.php文件中进行定时执行任务的编写。


[php]viewplain

 

namespaceHome\Controller; 

  

useThink\Controller; 

  

classIndexControllerextendsController 

  /* 

  publicfunctionindex(){ 

  $this->show('*{padding:0;margin:0;}div{padding:4px48px;}body{background:#fff;font-family:"微软雅黑";color:#333;}h1{font-size:100px;font-weight:normal;margin-bottom:12px;}p{line-height:1.8em;font-size:36px}

:)

欢迎使用ThinkPHP

http:

  } 

  */ 

  publicfunctionindex() 

  { 

    $contents=file_get_contents("test.txt"); 

    

    var_dump($contents); 

    exit; 

    $this->assign("contents",$contents); 

    $this->display(); 

  } 

  

  

  publicfunctioncrons() 

  { 

    

    file_put_contents("test.txt",date("Y-m-dH:i:s")."执行定时任务!"."\r\n
",FILE_APPEND); 

  } 


     这样定时执行任务我们就写好了,每隔5秒我们访问任何项目的url,然后查看根目录下的test.txt文件就会发现里面的内容变化。

     注意:当你修改间隔时间时会发现没有生效,这是你需要将Runtime/Data文件夹下的缓存文件删除,间隔时间缓存存放在CRON_CONFIG.php文件中。


     纯净的项目文件下载地址:http:

2、方法2:v3.2.2


    此方法和方法一没有多大的区别。


①、tags.php


    在/Application/Common/Conf目录下新建tags.php文件。(此和方法一处一样)


[php]viewplain

  

returnarray( 

  

  'app_begin'=>array('Behavior\CronRunBehavior'), 

); 

②、crons.php


    在/Application/Common/Conf目录下新建crons.php文件。(此处和方法一有区别,注意区分。)


[php]viewplain

  

returnarray( 

  

  

  'cron'=>array('myplan',2,nextruntime), 

); 

③、myplan.php


    在/Application/Common/目录下新建Cron文件夹,里面新建文件myplan.php文件。


[php]viewplain

  

echodate("Y-m-dH:i:s")."执行定时任务!"."\r\n
"; 

    此时我们就可以访问项目的url,然后我们会发现在Application/Runtime/目录下生成了~crons.php文件,文件内容如下:


[php]viewplain

  

  returnarray( 

    'cron'=> 

      array( 

        0=>'myplan', 

        1=>60, 

        2=>1398160322, 

      ), 

  ); 

  

?> 

    这样就可以观察结果了!

声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com