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 相关文章推荐
PHPMailer 中文使用说明小结
Jan 22 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
php邮件发送的两种方式
Apr 28 PHP
php metaphone()函数的定义和用法
May 15 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
Feb 26 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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
PHP高级OOP技术演示
2009/08/27 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
判断window.onload是否多次使用的方法
2014/09/21 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
初学python的操作难点总结(新手必看篇)
2017/08/03 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
Sanic框架Cookies操作示例
2018/07/17 Python
python里dict变成list实例方法
2019/06/26 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
浅谈python出错时traceback的解读
2020/07/15 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
英国最大的专业户外零售商:Mountain Warehouse
2018/06/06 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
远程教育心得体会
2014/01/03 职场文书
2014年体育工作总结
2014/11/24 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers