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 相关文章推荐
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
PHP http请求超时问题解决方案
Nov 13 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
js下函数般调用正则的方法附代码
2008/06/22 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
PHP Redis扩展无法加载的问题解决方法
2019/08/22 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
Jquery 弹出层插件实现代码
2009/10/24 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
浅谈jquery中next与siblings的区别
2016/10/27 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
小程序点击图片实现自动播放视频
2020/05/29 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python logging日志模块原理及操作解析
2019/10/12 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
毕业求职自荐信格式是什么
2013/11/19 职场文书
中英文自我评价语句
2013/12/20 职场文书
自荐书4要点
2014/01/25 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
新闻发布会策划方案
2014/06/12 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
Redis分布式锁Redlock的实现
2021/08/07 Redis