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 8小时时间差的解决方法小结
Dec 22 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
php json_encode值中大括号与花括号区别
Sep 30 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
php使用cookie实现记住登录状态
Apr 27 PHP
php实现对象克隆的方法
Jun 20 PHP
详解php比较操作符的安全问题
Dec 03 PHP
浅析PHP7新功能及语法变化总结
Jun 17 PHP
PHP实现的最大正向匹配算法示例
Dec 19 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 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使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
php如何获取Http请求
2020/04/30 PHP
JavaScript Prototype对象
2009/01/07 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
微信小程序日历组件使用方法详解
2018/12/29 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
python通过yield实现数组全排列的方法
2015/03/18 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
python学习基础之循环import及import过程
2018/04/22 Python
python实现输入数字的连续加减方法
2018/06/22 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Django models文件模型变更错误解决
2020/05/11 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
一年级语文教学反思
2014/02/13 职场文书
平安建设实施方案
2014/03/19 职场文书
纪念九一八事变演讲稿:勿忘国耻
2014/09/14 职场文书
2014年内勤工作总结
2014/11/24 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
企业宣传稿范文
2015/07/23 职场文书
创业计划书之花店
2019/09/20 职场文书
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
python中mongodb包操作数据库
2022/04/19 Python
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技