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基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
php编写简单的文章发布程序
Jun 18 PHP
浅谈php+phpStorm+xdebug配置方法
Sep 17 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
Ajax+Jpgraph实现的动态折线图功能示例
Feb 11 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中养成7个面向对象的好习惯
2010/07/17 PHP
PHP Session 变量的使用方法详解与实例代码
2013/09/11 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
layer插件select选中默认值的方法
2018/08/14 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
Webpack3+React16代码分割的实现
2021/03/03 Javascript
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
建筑专业自我鉴定
2013/10/22 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
魅力教师事迹材料
2014/01/10 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
教师外出学习心得体会
2016/01/18 职场文书