网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 PHP命令行执行整合pathinfo模拟定时任务实例
内容
    命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法
    Application.php
    <?php
    class Application{
      public static function main(){
        header("content-type:text/html;charset=utf-8");
        self::register();
        self::commandLine();
        self::pathInfo();
      }
      //自动加载
      public static function loadClass($class){
        $class=str_replace('\\', '/', $class);
        $dir=str_replace('\\', '/', __DIR__);
        $class=$dir."/".$class.".php";
        require_once $class;    
      }
      //命令行下
      public static function commandLine(){
        if(php_sapi_name()=="cli"){
          $_SERVER['PATH_INFO']="";
          foreach ($_SERVER['argv'] as $k=>$v) {
            if($k==0) continue;
            $_SERVER['PATH_INFO'].="/".$v;
          }
        }
      }
      //pathinfo处理
      public static function pathInfo(){
        if(isset($_SERVER['PATH_INFO'])){
          $pathinfo=array_filter(explode("/", $_SERVER['PATH_INFO']));
          for($i=1;$i<=count($pathinfo);$i++){
            $key=isset($pathinfo[$i]) ? $pathinfo[$i] : '';
            $value=isset($pathinfo[$i+1]) ? $pathinfo[$i+1] :"";
            switch ($i) {
              case 1:
                $_GET['m']=ucfirst($key);
                break;
              case 2:
                $_GET['c']=ucfirst($key);
                break;
              case 3:
                $_GET['a']=$key;
                break;
              default:
                if($i>3){
                  if($i%2==0){
                    $_GET[$key]=$value;
                  }
                }
                break;
            }
          }
        }
        $_GET['m']=!empty($_GET['m']) ? ucfirst($_GET['m']) : 'Index';
        $_GET['c']=!empty($_GET['c']) ? ucfirst($_GET['c']) : 'Index';
        $_GET['a']=!empty($_GET['a']) ? $_GET['a'] : 'index';
        $class="\\Controller\\{$_GET['m']}\\{$_GET['c']}";
        $controller=new $class;
        $controller->$_GET['a']();
      }
      //致命错误回调
      public static function shutdownCallback(){
        $e=error_get_last();
        if(!$e) return;
        self::errorHandler($e['type'],'<font color="red">Fatal Error</font> '.$e['message'],$e['file'],$e['line']);
      }
      //错误处理
      protected static function myErrorHandler($errno,$errstr,$errfile,$errline){
        list($micseconds,$seconds)=explode(" ",microtime());
        $micseconds=round($micseconds*1000);
        $micseconds=strlen($micseconds)==1 ? '0'.$micseconds : $micseconds;
        if(php_sapi_name()=="cli"){
          $break="\r\n";
        }else{
          $break="<br/>";
        }
        $mes="[".date("Y-m-d H:i:s",$seconds).":{$micseconds}] ".$errfile." ".$errline." line ".$errstr.$break;
        echo $mes;    
      }
      //注册
      public static function register(){
        error_reporting(0);
        set_error_handler(function($errno,$errstr,$errfile,$errline){
          self::myErrorHandler($errno,$errstr,$errfile,$errline);
        });
        register_shutdown_function(function(){
          self::shutdownCallback();
        });
        spl_autoload_register("self::loadClass");
      }
    }
    Application::main();
    \Controller\Client\Cron.php
    <?php
    namespace Controller\Client;
    class Cron{
      private $second=0;
      private $tasks=array(
        array("duration"=>5,"method"=>"doSomething"),
        array("duration"=>2,"method"=>"doSomething2"),
      );
      public function index(){
        while (true) {
          sleep(1);
          $this->second++;
          foreach($this->tasks as $task){
            if($this->second%$task['duration']==0){
              $this->$task['method']();
            }
          }
        }
      }
      public function doSomething(){
        echo "[".date("Y-m-d H:i:s",time())."] doSomething1 ok!\r\n";
      }
      public function doSomething2(){
        echo "[".date("Y-m-d H:i:s",time())."] doSomething2 ok!\r\n";
      }
    }
    效果:
    方法doSomething每隔2秒执行一次
    方法doSomething2每隔5秒执行一次
    现在执行其他方法是同步的,可以再优化成开新线程执行这些方法,就不会阻塞主线程的定时了
    名单
    以上这篇PHP命令行执行整合pathinfo模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/18 4:00:12