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中的串行化变量和序列化对象
Sep 05 PHP
PHP中Date获取时间不正确怎么办
Jun 05 PHP
深入理解PHP原理之异常机制
Aug 21 PHP
PHP5.4中json_encode中文转码的变化小结
Jan 30 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
php strftime函数的详细用法
Jun 21 PHP
PHP implode()函数用法讲解
Mar 08 PHP
php fread函数使用方法总结
May 28 PHP
PHP容器类的两种实现方式示例
Jul 24 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 PHP
你真的了解PHP中的引用符号(&)吗
May 12 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
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
python多线程同步之文件读写控制
2021/02/25 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
python如何实现word批量转HTML
2020/09/30 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
历史教育专业个人求职信
2013/12/13 职场文书
毕业生的自我评价分享
2013/12/18 职场文书
教师学习培训邀请函
2014/02/04 职场文书
全国优秀辅导员事迹材料
2014/05/14 职场文书
小学教师年度个人总结
2015/02/05 职场文书
表彰大会新闻稿
2015/07/17 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers