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 相关文章推荐
FleaPHP的安全设置方法
Sep 15 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
使用PHP导出Word文档的原理和实例
Oct 21 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
Jun 23 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
CI框架常用函数封装实例
Nov 21 PHP
PHP中函数gzuncompress无法使用的解决方法
Mar 02 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
php微信开发之谷歌测距
Jun 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动态生成静态HTML网页的代码
2010/03/04 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
Jquery使用小技巧汇总
2015/12/29 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
pymysql的简单封装代码实例
2020/01/08 Python
Django如何使用redis作为缓存
2020/05/21 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
Python try except else使用详解
2021/01/12 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
幼师自荐信范文
2013/10/06 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
营销学习心得体会
2014/09/12 职场文书
创先争优演讲稿
2014/09/15 职场文书
MySQL七大JOIN的具体使用
2022/02/28 MySQL