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 相关文章推荐
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
php header功能的使用
Oct 28 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
php自动给网址加上链接的方法
Jun 02 PHP
深入理解PHP中的Streams工具
Jul 03 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
php二维码生成以及下载实现
Sep 28 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 PHP
PHP队列场景以及实现代码实例详解
Feb 26 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的十大要点(上)
2009/02/04 PHP
在PHP中使用redis
2013/11/04 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
npm qs模块使用详解
2020/02/07 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
详解Vite的新体验
2021/02/22 Javascript
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python 读写文件的操作代码
2018/09/20 Python
利用python求积分的实例
2019/07/03 Python
详解Python打包分发工具setuptools
2019/08/05 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
英国日常交易网站:Wowcher
2018/09/04 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
土木工程个人自荐信范文
2013/11/30 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
个人典型事迹材料
2014/12/30 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
毕业赠语大全
2015/06/23 职场文书
二婚主持词
2015/06/30 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB