继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

Pizzaaa
关注TA
已关注
手记 23
粉丝 77
获赞 47

从今天从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

打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP