栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

SWOOLE 从入门到放弃之写个小框架(十五)

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SWOOLE 从入门到放弃之写个小框架(十五)

小框架里处理http和websocket是分两条线来实的,主要是为了减少代码的复杂度。然后这两种不同的业务线是要应对的不同场景的,不同的场景所涉及到的方法、对象、属性等等 都不同。http的控制器主要包含路由信息、http请求对象$request,http响应对象$response,在一些特定场景下,还需要直接使用$server对象,以及$task任务对象。同时还必须至少具备两个方法,第一个是模板渲染方法 display,第二是个json输出方法。而websocket的控制器就很简单了,路由信息,$server对象,数据帧$frame以及任务对象。

首先,创建frame/Lib/Controller.php,代码如下

gzip ();
 $this->response->header('Content-type','application/json');
 $json = json_encode($array);
 $json = is_null($callback) ? $json : "{$callback}({$json})" ;
 $this->response->end($json);
    }

    
    final public function display($param = array() ,$return = false){
 if(!is_array ($param)){
     Log::get_instance()->write('WARNING',"参数类型必须为key=>val式的数组");
 }
 extract($param);
 $this->gzip ();
 $path = Config::get_instance()->get('app.path').'/tpl/'.$this->route['m'].'/'.$this->route['c'] .'/'.$this->route['a'].'.php';
 if(!file_exists ($path)){
     $this->response->status(404);
     $this->response->end("模板不存在:".$path);
     Log::get_instance()->write('WARNING',"模板不存在",$path);
     return ;
 }
 if(!empty(ob_get_contents())) ob_end_clean ();
 ob_start();
 include $path;
 $content = ob_get_contents();
 ob_end_clean();
 $this->response->end($content);
    }

    
    final public function gzip($level = NULL  ){
 if($level === NULL ){
     $level = Config::get_instance ()->get('app.gzip',0);
 }
 $level>0 && $this->response->gzip( $level);
    }

    public function __set($name,$object){
 $this->$name = $object;
    }

    public function __get($name){
 return $this->$name;
    }

}

接下来创建frame/Lib/WsController.php,代码如下

$name = $object;
    }

    public function __get($name){
 return $this->$name;
    }
}

怎么样,是不是很简单。。。

接下来,我要在App.php上做个限制,目的是为了防止http业务继承了websocket的控制器,同样也怕这个问题在websocket业务上出现,怎么办呢,一,强制所有的项目控制器必须继续小框架的控制器,第二,在App.php上检查项目控制器的继承类名称。
代码修改方法也简单,用到了一个php自带的方法 get_parent_class ,用它来检查是否继承自指定的类。

App->http增加以下代码

if(get_parent_class ($class)!='PizController'){
      $response->header('Content-type',"text/html;charset=utf-8;");
      $response->status(503);
      $response->end('503 Service Unavailable');
      echo "[{$classname}]  必须继承 PizController",PHP_EOL;
      return ;
  }

App->websocket增加以下代码

if(get_parent_class ($class)!='PizWsController'){
      echo "[{$classname}]  必须继承 PizWsController",PHP_EOL;
      return ;
  }

App.php代码请移步码云 https://gitee.com/pizzzz/piz/blob/master/frame/Lib/App.php

接下来就是修改app/modules下各模块控制器的继承类了,小伙伴们自己改吧。。我就不贴代码了。

下一篇,Log不能少

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/228212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号