swoole多端口监听
今天测试swoole写webserver实现多端口监听。记录下爬过的坑:关于tcp协议监听触发不到receive!!!!!
首先上服务端代码
class Http
{ /**
* 服务实例
* @var Server
*/
protected $server; public function run(){ $setting = Config::get('http');
/*开启监听*/
$this->server = new Server($setting['host'],$setting['port']); if (isset($setting['config']) && $setting['config'])$this->server->set($setting['config']); if (isset($setting['tcp_check']) && $setting['tcp_check']){
/*开启多端口监听*/
$port = $this->server->addListener('127.0.0.1','9501',SWOOLE_SOCK_TCP);
$port->on('connect',[$this,'connect']);
$port->on('receive',[$this,'receive']);
} $this->server->on('start',[$this,'start']);
$this->server->on('request',[$this,'request']); $this->server->on('workerStart',[$this,'workerStart']); $this->server->start();
} /**
* 主进程启动
* @param Server $server
*/
public function start(Server $server){
$reload = Reload::getInstance(Config::get('reload_watch'));
/*启动定时热重启检测*/
swoole_timer_tick(6000,function ()use ($reload){
if ($reload->reload()) $this->server->reload();
});
} /**
*
* @param Request $request
* @param Response $response
*/
public function request(Request $request,Response $response){ $route = Route::get_instance();
$route->dispatch($request,$response);
} public function workerStart(Server $server, int $worker_id){
/*可热重启配置*/
Config::loadLazy();
/*加载路由*/
include_once APP_PATH.'/route.php';
} public function connect(Server $server,int $fd, int $reactorId){
var_dump('connection');
} public function receive(Server $server, int $fd, int $reactor_id, string $data){
var_dump('receive',$data);
} }
当我调用本地tcp client向服务发送tcp请求并发送数据的时候发现如下结果:
[root@bin]# php walter.php
string(10) "connection"
发现没,tcp监听服务只触发了connect回调,receive回调竟然没有触发成功。经过不断调试后来在官网看到如下一段话得到了启发。

官网说增加监听端口需要单独调用set函数来为addListener返回的swoole_server_port对象设置监听配置注意,只对1.8.0以上版本有效

后来在开启多端口监听中加入了$port->set([]);这一行后发现监听服务可以顺利监听到并且成功触发了recrive
public function run(){
        $setting = Config::get('http');
        /*开启监听*/
        $this->server = new Server($setting['host'],$setting['port']);
        if (isset($setting['config']) && $setting['config'])$this->server->set($setting['config']);
        if (isset($setting['tcp_check']) && $setting['tcp_check']){
            /*开启多端口监听*/
            $port = $this->server->addListener('127.0.0.1','9501',SWOOLE_SOCK_TCP);
            $port->set([]);
            $port->on('connect',[$this,'connect']);
            $port->on('receive',[$this,'receive']);
        }
        $this->server->on('start',[$this,'start']);
        $this->server->on('request',[$this,'request']);
        $this->server->on('workerStart',[$this,'workerStart']);
        $this->server->start();
    }
收到结果如下:
[root@bin]# php walter.php
string(10) "connection"
string(7) "receive"
string(11) "hello world"
虽然不知道这个是不是swoole目前的bug,官网上暂时没看到类似的问题跟文档说明。但是这个是实实在在需要注意的。每一个server都必须调用set函数设置需要的配置,哪怕你什么都不想要设置都要给个空数组进去以防万一。
另外还有一个需要注意的当监听多端口的时候swoole_server_port->set()设置worker_num数量的时候这里的worker进程不会另外创建,应该是从主进程创建的worker中创建的worker中分配相应数量的进程给swoole_server_port的。所以这里设置的数量比主进程设置的多是没有用的。主进程设置生成的worker数量是多少就多少。以上只是个人猜测,至于swoole底层如何处理这个swoole_server_port设置的worker_num配置不得而知,还没真正看过底层的实现代码。也有人的说法是swoole_server_port设置worker_num是不生效的。哪种说法正确只有以后有机会看看底层源码来判断了。或许这个也是当前版本的bug也说不定。
当前测试的swoole版本为4.2.8
swoole多端口监听的更多相关文章
- nodejs 80端口监听失败及NODE_PATH不起作用的问题
		
nodejs做web服务器,打开80时报错:Error: listen EACCES 0.0.0.0:80 80端口监听失败,是因为1024以下的端口需要root权限,需要sudo或su之后执行.但这 ...
 - asp.net core 多端口监听&日志服务
		
1 配置多个端口监听 HostingAbstractionsWebHostBuilderExtensions. public static IWebHostBuilder UseUrls(this I ...
 - netty同端口监听tcp和websocket协议
		
前言: 软件通信七层结构(osi模型)中由协议套协议最终组成最高级应用层协议(http等等),下三层结构偏向与数据通信,上三层更偏向于数据处理,中间的传输层则是连接上三层与下三层之间的桥梁,每一层都做 ...
 - 获取运行端口监听的用户身份auth-owner
		
获取运行端口监听的用户身份auth-owner Windows系统提供工作在TCP 113端口的授权服务(Authentication Service),用来判断TCP连接的用户.Nmap的aut ...
 - 利用 netsh 给 mysql 开启多端口监听
		
利用 netsh 给 mysql 开启多端口监听 标题党,实际并不是真的多端口监听,只是端口转发而已. 由于某种特殊原因需要 mysql 服务器多个端口监听. mysql 服务器本身是不支持的,但可以 ...
 - 多进程端口监听  How nginx processes a request Server names
		
网络编程( 六):端口那些事儿 - 知乎专栏 https://zhuanlan.zhihu.com/p/20365900 不停服务reload.restart 多进程端口监听 我们都有一个计算机网络 ...
 - ZooKeeper(二):多个端口监听的建立逻辑解析
		
ZooKeeper 作为优秀的分布系统协调组件,值得一探究竟.它的启动类主要为: 1. 单机版的zk 使用 ZooKeeperServerMain 2. 集群版的zk 使用 QuorumPeerMai ...
 - Apache多端口监听
		
打开:config/httpd.conf 找到Listen 80 在下面增加你要监听的端口,修改后如下: Listen 80 Listen 81 重启apache服务器
 - ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)
		
不论是单实例还是RAC,对于非缺省端口下(1521)的监听器,pmon进程不会将service/instance注册到监听器,即不会实现动态注册.与单实例相同,RAC非缺省端口的监听器也是通过设置参数 ...
 
随机推荐
- android 工具库
			
https://github.com/xybCoder/AndroidCommon android工具类集合
 - ElasticSearch(2)---SpringBoot整合ElasticSearch
			
SpringBoot整合ElasticSearch 一.基于spring-boot-starter-data-elasticsearch整合 开发环境:springboot版本:2.0.1,elast ...
 - 带着新人学springboot的应用06(springboot+RabbitMQ 中)
			
上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...
 - 如何发起、防御和测试XSS攻击,我们用DVWA来学习(下)
			
上一篇我们了解了XSS攻击的原理,并且利用DVWA尝试了简单的XSS攻击,这一篇我们来实现更复杂的攻击,然后探讨防御机制和测试理念. 前面我们通过脚本注入让网页弹出了用户cookie信息,可以光弹窗是 ...
 - Chapter 5 Blood Type——8
			
He chuckled. "What are your plans?" 他窃笑道.“那你的计划是什么?” I blushed. I had been vacillating dur ...
 - spring cloud 配置zuul实用
			
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡 ...
 - Java面试系列--java基础
			
Java基础总结 JAVA中的几种基本数据类型是什么,各自占用多少字节. 八大基本数据类型,byte:8位,short:16位,int:32位,long:64位,float:32位,double:64 ...
 - javascript基础修炼(2)——What's this(上)
			
目录 一.this是什么 二.近距离看this 三. this的一般指向规则 四. 基本规则示例 五. 后记 开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. 一.thi ...
 - 第59章 IdentityServer交互服务 - Identity Server 4 中文文档(v1.0.0)
			
IIdentityServerInteractionService接口旨在提供用户界面用于与IdentityServer通信的服务,主要与用户交互有关.它可以从依赖注入系统获得,通常作为构造函数参数注 ...
 - .net mvc 导出excel表格
			
使用using System.IO; /// /// 导出Excel文件,并自定义文件名 /// public static void DataTableExcel(System.Data.DataT ...