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

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秒执行一次

现在执行其他方法是同步的,可以再优化成开新线程执行这些方法,就不会阻塞主线程的定时了

最新文章

  1. localStorage与sessionStorage 的区别
  2. 遇到 Line 21: StartTag: invalid element name ios
  3. 转载css的background-position
  4. LoopbackJS 生成对应 Oracle 视图的model
  5. Jetson TK1刷机+配置Mini PCI-e无线网卡
  6. javaWEB国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用
  7. 论XCODE工程里使用的宏定义.
  8. 遍历List/Map的时候删除成员遇到的奇怪问题
  9. sql表连接left join,right join,inner join三者之间的区别
  10. MATLAB中的结构数组
  11. UI经验
  12. Javascript中布尔运算符的高级应用
  13. java或判断优化小技巧
  14. python 基础语法梳理
  15. Vmware的虚拟机示例进入BIOS方法
  16. LevelDB初体验测试
  17. CF1096. G. Lucky Tickets(快速幂NTT)
  18. zabbix系列之一——简要介绍
  19. 国内各视频网站android pad客户端支持分辨率情况初步统计
  20. SQL中判断值是否为NULL

热门文章

  1. mac或linux下xampp的mysql配置
  2. SQL2008数据库优化常用脚本
  3. cocos2dx在ubuntu下配置声音引擎
  4. 正向代理VS反向代理 总结
  5. 从头构建自己的Linux系统
  6. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
  7. C#基础总结之一变量常量-if嵌套语句-witch结构-类型转换
  8. js中的执行上下文,菜鸟入门基础。
  9. 使用 IntelliJ IDEA 2016和Maven创建Java Web项目的详细步骤及相关问题解决办法
  10. SharePoint 2013 搜索爬网功能