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非缺省端口的监听器也是通过设置参数 ...
随机推荐
- 【Storm篇】--Storm 容错机制
一.前述 Storm容错机制相比其他的大数据组件做的非常不错. 二.具体原因 结合Storm集群架构图: 我们的程序提交流程如下: 其中各个组件的作用如下: Nimbus资源调度任务分配接收jar ...
- Node.js与Sails~redis组件的使用
有段时间没写关于NodeJs的文章了,今天也是为了解决高并发的问题,而想起了这个东西,IIS的站点在并发量达到200时有了一个瓶颈,于是想到了这个对高并发支持比较好的框架,nodeJs在我之前写出一些 ...
- Pandas 基础学习
加载数据 Fun:pandas.read_csv >>> import pandas >>> food_info = pandas.read_csv("f ...
- linux下sh脚本/bin/bash^M问题解决
如果是在windows下编辑的脚本,到了linux下运行时会报出这样的错误/bin/bash^M:bad interpreter: No such file or directory这时因为编码的问题 ...
- java内部类深入详解 内部类的分类 特点 定义方式 使用
本文关键词: java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内 ...
- springboot2.0.3源码篇 - 自动配置的实现,发现也不是那么复杂
前言 开心一刻 女儿: “妈妈,你这么漂亮,当年怎么嫁给了爸爸呢?” 妈妈: “当年你爸不是穷嘛!‘ 女儿: “穷你还嫁给他!” 妈妈: “那时候刚刚毕业参加工作,领导对我说,他是我的扶贫对象,我年轻 ...
- 微信公众号通过图片选取接口上传到阿里oss
前言 之前写过一篇微信JS-SDK的使用方法,可进行参考 https://www.cnblogs.com/fozero/p/10256862.html 配置并调用公众号接口权限 1.配置权限微信公众号 ...
- 提升学习算法简述:AdaBoost, GBDT和XGBoost
1. 历史及演进 提升学习算法,又常常被称为Boosting,其主要思想是集成多个弱分类器,然后线性组合成为强分类器.为什么弱分类算法可以通过线性组合形成强分类算法?其实这是有一定的理论基础的.198 ...
- 内核中 xxx_initcall 的调用过程分析
内核版本:linux-4.19 上一篇文章提到了这段代码: arch_initcall_sync(of_platform_default_populate_init); 它的功能是完成 device_ ...
- Visual Studio Code 语言设置
下载Visual Studio Code,下载地址:https://code.visualstudio.com/ 参考官网安装之后,想要设置界面展示语言. 设置参考:https://code.visu ...