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 相关文章推荐
PHP新手上路(十三)
Oct 09 PHP
php下正则来匹配dede模板标签的代码
Aug 21 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
php数组随机排序实现方法
Jun 13 PHP
PHP多维数组指定多字段排序的示例代码
May 16 PHP
浅谈php://filter的妙用
Mar 05 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 PHP
PHP基于ip2long实现IP转换整形
Dec 11 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
数据库的日期格式转换
2006/10/09 PHP
Function eregi is deprecated (解决方法)
2013/06/21 PHP
php生成二维码
2015/08/10 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
一个简单的js动画效果代码
2010/07/20 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Python快速排序算法实例分析
2017/11/29 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python 中的lambda函数介绍
2018/10/10 Python
python实现简单的购物程序代码实例
2020/03/03 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
企业业务员岗位职责
2014/03/14 职场文书
2014年党支部承诺书
2014/05/30 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
纪录片信仰观后感
2015/06/08 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
Nginx跨域问题解析与解决
2022/08/05 Servers