PHP命令行执行整合pathinfo模拟定时任务实例
发布时间:2020-12-12 21:40:36 所属栏目:PHP教程 来源:网络整理
导读:命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法 Application.php $v) { if($k==0) continue; $_SERVER['PATH_INFO'].="/".$v; } } } //pathinfo处理 public static function pathInfo(){ if(isset($_SERVER['PATH_INFO'])){ $pa
命令行模式下,根据传参,调用不同控制器。控制器中根据配置定时执行指定方法 Application.php $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'],' '.$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="rn";
}else{
$break="
"; } $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,$errline){ self::myErrorHandler($errno,$errline); }); register_shutdown_function(function(){ self::shutdownCallback(); }); spl_autoload_register("self::loadClass"); } } Application::main(); ControllerClientCron.php 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!rn"; } public function doSomething2(){ echo "[".date("Y-m-d H:i:s",time())."] doSomething2 ok!rn"; } } 效果:方法doSomething每隔2秒执行一次 方法doSomething2每隔5秒执行一次 现在执行其他方法是同步的,可以再优化成开新线程执行这些方法,就不会阻塞主线程的定时了 以上这篇PHP命令行执行整合pathinfo模拟定时任务实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |