php教程

超轻量级php框架startmvc

PHP命令行执行整合pathinfo模拟定时任务实例

更新时间:2020-03-11 11:42:39 作者:startmvc
命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法Application.

命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法

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