Git --NB Framework 中文教程
目录 ▾ 服务器

最后更新于:2018-10-27 16:26
69次阅读0条评论

服务

NB实现了Swoole支持的TCP、HTTP,WebSocket 服务,还封装了PHP内置的webserver,方便进行快速测试和开发。

HTTP Server

httpserver和常规的php-fpm差不多,支持基础内容的所有功能。

启动配置

public $server = [
    'driver'=>'http',//设置启动驱动为httpserver
    'register'=>'common\\Server',//设置swoole回调类,可省略
    
    //swoole原生配置
    'host'=>'0.0.0.0',
    'port'=>9501,
    'log_file'=>__APP__.'tmp'.DS.'swoole-http.log',
    'enable_pid'=>'/tmp/swoole.pid',
    'daemonize'=>false,
    ...
];

通过上面配置,我们就可以通过./server start启动httpserver了。
控制台上会打印出当前启动的模式,监听的地址端口,以及相关版本等信息

➜ ./server start
 __     _   ____
|   \  | | | __ )
| |\ \ | | |  _ \    @_@
| | \ \| | | |_) |     。。。
|_|  \___| |____/  is a good framework!
--------------------------------------------------
server pattern       Http
listen address       0.0.0.0
listen port          9501
worker num           2
task worker num      2
swoole version       4.2.1

然后可以在浏览器上访问http://127.0.0.1:9501,将看到反馈结果。

处理静态资源

通常httpserver都是作为api服务使用,所以默认httpserver是不支持静态资源的处理的,如css,img之类的。如果你要使用httpserver来开发网页应用,可以使用nginx来代理静态资源。
Nginx可以如下设置:

server {
    listen 80;
    server_name test.nb.cx;
    index index.php;

    location / {
        rewrite ".+" "/index.php" last;
    }

    location ~ .*\.php {
        proxy_pass http://10.28.167.98:9502;
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
    }

    location ~ .*\.(html|ttf|ico|css|js|gif|jpg|jpeg|png|bmp|swf)$ {
            root /home/demo/public/;
        expires 90d;
    }
}

上面将httpserver作为php-fpm使用,用nginx代理,当然你可以只代理静态资源。
如果你的应用很简单,不想额外的安装nginx,也可以使用httpserver来处理静态资源,此时需要添加如下配置:

 //HttpServer模式下,可添加此配置处理资源文件请求
public  $dispatcher = [
    'enable'=>true,    //是否开启资源文件请求处理
    'path'=>__APP__,    //资源文件根目录
    'allow'=>'ico|css|js|jpg|png',    //允许处理的资源文件后戳
    'expire'=>1800,    //浏览器过期时间
];

上面的Dispatcher组件配置,只在httpserver模式下起作用。
注释已经描述了各个配置的作用,这里就不在说明。如果是开发网页应用,还是推荐用nginx代理,swoole处理静态资源的效率并不是最高的。

WebSocket Server

NB使用了swoole websocket的onMessage回调,使websocket开发和web开发基本保持一样,降低其使用难度。

启动配置

websocket的配置基本和httpserver差不多,但是还是有一些区别。如下

public $server = [
    'driver'=>'websocket', //设置启动驱动为httpserver
    'register'=>'common\\Server', //设置swoole回调类,可省略
    
    'enable_http'=>true, //是否同时开启http协议支持
    
    //swoole原生配置
    'host'=>'0.0.0.0',
    'port'=>9501,
    ...
];

注意enable_http属性,这是NB需要的配置属性,只在websocket模式下有用。
它表示在使用websocke协议的同时,还支持http协议。

解析

不同于http,我们需要手动解析websocket接受到的数据,将其填充给Requst组件。
在之前章节里有介绍到,框架配置里又一个register配置属性,用来处理框架里的一些自定义事件,这里我们假定register的值为event\\Framework。里面有如下代码:

class Framework extends nb\event\Framework {
 
    public function request($request) {
        
        if(Config::$o->sapi == 'http') {
            //如果enable_http为true,我们需要过滤屌http请求
            return;
        }
        $data = json_decode($request->data,true);

        if(json_last_error()) {
            echo 'The data must be a JSON string';
            quit();
        }
        $request->pathinfo = isset($data['action'])?$data['action']:'';
        unset($data['action']);
        $request->input = $data;
    }
}

上面代码作用是,当客户端向websocket发送数据时,websocket会检查是否为json数据,如果不是将向客户端返回错误信息The data must be a JSON string.
如果是json,就转为php数组,将action的值赋值给$request的pathinfo属性,其它数据赋值给input属性。

也就是规定了连接websocket的客户端,数据协议必须如下:

{
    "action":"login/index",  //相当于http的URL地址,匹配对应的控制器
    "data":"1243"    //业务数据
}

路由Router组件,总是根据Request组件的pathinfo属性来解析路由,所以我们在request()触发事件里,必须给pathinfo赋值。
而input保存的是数据,相当于http中表单等数据,所以我们把业务数据赋值给它的input属性,这样我们在控制器里或者service里,可以使用如下方式来获取数据了。

$this->input()
$this->form()
$this->formx()

消息发送

通常情况下,它和常规的php的web模式是一样的,我们在代码里echo 输出,都会返回给当前连接的客户端。

如果想要向指定客服端发送数据,可以这样:

$server = Server::driver();
$server->send( $fd, 'data...' );

//也可以这样直接给当前连接的客服端返回数据
$server->reply(  'data...' );

上面的sendreply函数,是框架封装的统一推送数据的api,你在TCP模式下,也可以这样向客户端推送数据。
在websocket模式下,它们其实都是封装swoole的swoolewebsocketServer类提供的push函数。
所以,在websocket模式下,你也可以这样推送数据,不过不推荐下面的方式,因为如果有时你突然要切换到tcp模式下,代码就不兼容了。

$server = Server::driver();
$server->push( $fd, 'data...' );

TCP Server

用法和Websocket基本差不多,后续在详细补充。

开发

配置选项

如上面所属,swoole server的配置都是写在框架的server属性值里。
除了NB框架需要的,剩下的按自己开启的server类型,到Swoole的官方文档,根据自己的业务需求,进行设置。

回调函数

swoole支持的回调函数参考这里https://wiki.swoole.com/wiki/page/41.html

如果在NB里使用这些回调函数,你可以定义一个nb\event\Swoole的子类,在子类里面,根据swoole回调函数的名字来创建回调函数。

你需要注意的是,swoole的回调函数名都是以on开头的,但是在子类里面,你需要去掉on.

namespace event;

use nb\event\Swoole;

//定义Websocket的swoole事件回调函数
class Websocket extends Swoole {
 
    //实现Swoole的onConnect回调函数
    public function connect($server, $fd) {
        echo "connection open: {$fd}\n";
    }
        
    //实现Swoole的onClose回调函数
    public function close($server, $fd) {
        echo "connection close: {$fd}\n";
    }

}

当我们回调函数开发好了,你需要把它加到server组件的配置里。

public $server = [
    'driver'=>'websocket',
    
    //此处是完整的类名,也可以这样写:\event\Websocket::class
    'register'=>'event\Websocket', 
    ...
];
上一篇:响应输出
下一篇:重定向

相关评论

您需要登录后才可以发表评论