[PHP] 命令行执行整合pathinfo模拟定时任务详解编程语言

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

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模拟定时任务详解编程语言

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/12593.html

(0)
上一篇 2021年7月19日 14:44
下一篇 2021年7月19日 14:44

相关推荐

发表回复

登录后才能评论