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