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 相关文章推荐
SSI指令
Nov 25 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
浅析get与post的一些特殊情况
Jul 28 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
php文件缓存方法总结
Mar 16 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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 PDO函数库详解
2010/04/27 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
Json解析的方法小结
2016/06/22 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
python 文件与目录操作
2008/12/24 Python
python中字符串前面加r的作用
2015/06/04 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
python烟花效果的代码实例
2020/02/25 Python
python3 实现口罩抽签的功能
2020/03/11 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
市场部经理岗位职责
2014/04/10 职场文书
公司离职证明样本
2014/09/13 职场文书
四风对照检查材料范文
2014/09/27 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python