PHP命令行执行整合pathinfo模拟定时任务实例

5年以前  |  阅读数:274 次  |  编程语言:PHP 

命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法

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模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例