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 相关文章推荐
使用php4加速网络传输
Oct 09 PHP
PHP通用检测函数集合
Nov 25 PHP
php 特殊字符处理函数
Sep 05 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
php标签云的实现代码
Oct 10 PHP
ThinkPHP调用百度翻译类实现在线翻译
Jun 26 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
Mar 22 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
PHP 构造函数和析构函数原理与用法分析
Apr 21 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
WHOIS类的修改版
2006/10/09 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php 在线打包_支持子目录
2008/06/28 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python中必要的名词解释
2019/11/20 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
如何通过命令行进入python
2020/07/06 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
python绘制趋势图的示例
2020/09/17 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
手术室护士自我鉴定
2013/10/14 职场文书
纪念建党演讲稿范文
2014/01/13 职场文书
玲玲的画教学反思
2014/02/04 职场文书
新学期标语
2014/06/30 职场文书
迎七一演讲稿
2014/09/12 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书