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


Posted in PHP onAugust 12, 2016

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

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命令行执行整合pathinfo模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
PHP中文件上传的一个问题
Sep 04 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
laravel异步监控定时调度器实例详解
Jun 21 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 PHP
谈谈PHP连接Access数据库的注意事项
Aug 12 #PHP
总结PHP中DateTime的常用方法
Aug 11 #PHP
php使用curl详细解析及问题汇总
Aug 11 #PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 #PHP
示例详解Laravel重置密码代码重构
Aug 10 #PHP
修改Laravel5.3中的路由文件与路径
Aug 10 #PHP
Yii2中关联查询简单用法示例
Aug 10 #PHP
You might like
PHP中动态显示签名和ip原理
2007/03/28 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP7 list() 函数修改
2021/03/09 PHP
Code:loadScript( )加载js的功能函数
2007/02/02 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
vuejs指令详解
2017/02/07 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
python自动12306抢票软件实现代码
2018/02/24 Python
python写入已存在的excel数据实例
2018/05/03 Python
python实现批量修改图片格式和尺寸
2018/06/07 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Python基于当前时间批量创建文件
2020/05/07 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
毕业生机械建模求职信
2013/10/14 职场文书
客服实习的个人自我鉴定
2013/10/20 职场文书
学校门卫管理制度
2014/01/30 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
环保宣传标语
2014/06/12 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
Python进程间的通信之语法学习
2022/04/11 Python