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的控制语句
Oct 09 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
重新认识php array_merge函数
Aug 31 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
VPS中使用LNMP安装WordPress教程
Dec 28 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
Mar 03 PHP
THINKPHP截取中文字符串函数实例代码
Mar 20 PHP
php文件包含目录配置open_basedir的使用与性能详解
Apr 03 PHP
php实现微信支付之企业付款
May 30 PHP
PHP getNamespaces()函数讲解
Feb 03 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的header和asp中的redirect比较
2006/10/09 PHP
微信支付开发交易通知实例
2016/07/12 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
JavaScript实现简单验证码
2020/08/24 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python 比较两个数组的元素的异同方法
2017/08/17 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
python库lxml在linux和WIN系统下的安装
2018/06/24 Python
python求最大值最小值方法总结
2019/06/25 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
python__name__原理及用法详解
2019/11/02 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
Python如何将装饰器定义为类
2020/07/30 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
美体小铺波兰官方网站:The Body Shop波兰
2019/09/03 全球购物
物业管理大学生个人的自我评价
2013/10/10 职场文书
酒店led欢迎词
2014/01/09 职场文书
大学团日活动总结书
2015/05/11 职场文书
预备党员入党感想
2015/08/10 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
Android studio 简单计算器的编写
2022/05/20 Java/Android
从原生JavaScript到React深入理解
2022/07/23 Javascript