从今天从Server.php入手,文章一开始时就说过,小框架的目的是要实现一个包含HTTP+WEBSOCKET的服务。官网文档介绍过,swoole_websocket_server 继承自 swoole_http_server,设置了onRequest回调,websocket服务器也可以同时作为http服务器来使用。因为我们要两步走。一、纯HTTP服务我们就采用swoole_http_server来实现;二、WEBSOCKET服务要同时支持HTTP。
前边已经实现了Config.php,那我们就把它再次使用起来。我在SWOOLE 从入门到放弃之写个小框架(十)创建了配置文件config/app.php,现在就把它利用起来,app.php配置代码如下:
<?php
/**
 * APP配置
 */
return [
    'name'      => 'server',                            //项目名称
    'namespace' => 'app',                               //项目命名空间
    'path'      => realpath (__DIR__.'/../app/'),  //项目所在路径
    'gzip'      => 0,                                    //gzip 等级, 请查看  https://wiki.swoole.com/wiki/page/410.html
    //server设置
    'ip'        => '0.0.0.0',   //监听IP
    'port'      => 9527,        //监听端口
    'server'    => 'websocket' ,     //服务,可选 websocket 默认http
    'set'       => [            //配置参数  请查看  https://wiki.swoole.com/wiki/page/274.html
        'daemonize'             => 0 ,
        'enable_static_handler' => TRUE ,
        'document_root'         => realpath (__DIR__.'/../static/') ,
        'worker_num'            => 4,
        'max_request'        => 10000,
        'task_worker_num'       => 4,
    ],
];接下来就要改造frame/Lib/Server.php
首先,把Server.php改造成单例模式,
/**
     * 实例化
     * @var object
     */
    private static $instance;
    /**
     * SWOOLE实例对象
     * @var object
     */
    private $server ;
    /**
     * 配置
     * @var 
     */
    private $config = [];
    private function __construct( ){ }
    public static function get_instance(){
        if(is_null (self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }然后,还需要从外部传入配置信息,增加代码
/**
     * 配置信息赋值
     * @param $config
     */
    public function set_config($config){
        $this->config = $config;
    }配置文件需明确配置要启动的服务,可选的配置项是websocket和http,其中http要做为默认选项,并通过它来确定是否启动swoole_websocet_server。另外,如果启用swoole的task,必须配置对应的task_worker_num参数,在某些特定场景下可能不需要启用它,所以必须针对这个情况做特定的判断,代码如下
    public function run(){
        $swoole_server = isset($this->config['server']) && $this->config['server'] == 'websocket' ? 'swoole_websocket_server' : 'swoole_http_server';
        $this->server = new $swoole_server($this->config['ip'],$this->config['port']);
        $this->server->set($this->config['set']);
        $this->server->on('start', [$this, 'onStart']);
        $this->server->on('WorkerStart', [$this, 'onWorkerStart']);
        if($this->config['server'] == 'websocket'){
            $this->server->on('open' ,[$this,'onOpen']);
            $this->server->on('message',[$this,'onMessage']);
            $this->server->on('close',[$this,'onClose']);
        }
        if( isset($this->config['set']['task_worker_num']) && $this->config['set']['task_worker_num']>0){
            $this->server->on('task',[$this,'onTask']);
            $this->server->on('finish',[$this,'onFinish']);
        }
        $this->server->on('request' ,[$this,'onRequest']);
        $this->server->start();
    }Server.php代码请移步 https://gitee.com/pizzzz/piz/blob/master/frame/Lib/Server.php
因为config/app.php配置set项下 server=>websocket,所以我们需要测试websocket,这就必须支持静态文件,配置项如下
        'enable_static_handler' => TRUE ,                                     启动静态支持
        'document_root'         => realpath (__DIR__.'/../static/') ,静态文件目录HTML代码我就不贴了,小伙伴们有兴趣请移步 https://gitee.com/pizzzz/piz/tree/master/static 下载 ws.html和lib/jquery.min.js
启动文件start.php 需要修改一下代码,代码如下
<?php
require "./frame/base.php";
//小宝贝,跑起来。
\Piz\Server::get_instance ()->set_config (\Piz\Config::get_instance ()->get ('app'));
\Piz\Server::get_instance ()->run();终端输入 php start.php  ,让它跑起来。。
先看下HTTP
再访问 http://192.168.1.111:9501/ws.html ,第一是看静态支持是否成功,第二看它的文本提示是否与WEBSOCKET服务连接成功了。
已经按我们的预期运行了。
接下来,我们就要折腾App.php和Router.php。
小伙伴们可移步至码云下载代码  https://gitee.com/pizzzz/piz
共同学习,写下你的评论
评论加载中...
作者其他优质文章
 
                 
            

 
			 
					 
					