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

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

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

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

从今天从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配置代码如下:

 '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改造成单例模式,

    private static $instance;
    
    private $server ;
    
    private $config = [];

    private function __construct( ){ }

    public static function get_instance(){
 if(is_null (self::$instance)){
     self::$instance = new self();
 }
 return self::$instance;
    }

然后,还需要从外部传入配置信息,增加代码

    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 需要修改一下代码,代码如下

set_config (PizConfig::get_instance ()->get ('app'));
PizServer::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

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

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

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