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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
php cookies中删除的一般赋值方法
May 07 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
yii数据库的查询方法
Dec 28 PHP
PHP 二级子目录(后台目录)设置二级域名
Mar 02 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
PHPTree――php快速生成无限级分类
Mar 30 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php文档更新介绍
2011/07/22 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
跟老齐学Python之变量和参数
2014/10/10 Python
Python抓取百度查询结果的方法
2015/07/08 Python
Python实现八皇后问题示例代码
2018/12/09 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
详解python中eval函数的作用
2019/10/22 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python requests模块安装及使用教程图解
2020/06/30 Python
Django返回HTML文件的实现方法
2020/09/17 Python
小结Python的反射机制
2020/09/28 Python
python 装饰器重要在哪
2021/02/14 Python
汽车维修专业个人求职信范文
2014/01/01 职场文书
教学实习自我评价
2014/01/28 职场文书
施工材料员岗位职责
2014/02/12 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技
MySQL分区以及建索引的方法总结
2022/04/13 MySQL