swoole websocket ssl搭建的socket服务端长时间无连接就自动关掉了是怎么回事

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
服务端开了$serv = new swoole_server("0.0.0.0", 9501); 网页端开了var exampleSocket = new WebSocket("ws://192.168.1.50:9501");一直提示 WebSocket connection to 'ws://192.168.1.50:9501/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE但是看到服务端显示 Client: Connect.Client: Close.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你应该用 swoole_websocket_server 而不是 swoole_server。
再来解释为什么服务端会有输出。
为什么呢,你一定是在监听到连接和断开连接的时候就输出的吧。
原因呢,是 Websocket 是通过 HTTP 来进行握手的。而 HTTP 是的下层协议是 TCP,在 Swoole 里也就对应了 swoole_server。TCP 的握手是一定会有的,只是如果你用 Websocket 直接去连接 TCP 的服务,肯定是握不上 Websocket 的手的。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
上代码:服务端:
class Websocket extends Command
protected $
protected function configure()
// setName 设置命令行名称
// setDescription 设置命令行描述
$this-&setName('websocket:start')-&setDescription('Start Web Socket Server!');
// 设置命令返回信息
protected function execute(Input $input, Output $output)
$this-&server = new \swoole_websocket_server('0.0.0.0', 10000);
$this-&server-&set([
设置启动的worker进程数
业务代码是全异步非阻塞的,这里设置为CPU的1-4倍最合理
业务代码为同步阻塞,需要根据请求响应时间和系统负载来调整
'worker_num' =& 4,
// 守护进程化
'daemonize'
// 监听队列的长度
$this-&server-&on('Open', [$this, 'onOpen']);
$this-&server-&on('Message', [$this, 'onMessage']);
$this-&server-&on('Close', [$this, 'onClose']);
$this-&server-&on('WorkerStart', [$this, 'onWorkerStart']);
$this-&server-&start();
public function onOpen(\swoole_websocket_server $server, \swoole_http_request $request)
echo "server: handshake success with fd{$request-&fd}\n";
public function onWorkerStart($server,$workerId){
echo "worker started: {$workerId}\n";
$server-&tick(2000, function() use ($server) {
$workFd = Cache::get("workFd");//只通知工作客户端
if(empty($workFd)|| count($server-&connections)==0)
$server-&push($workFd,time());
// 收到数据时回调函数
public function onMessage(\swoole_websocket_server $server, \swoole_websocket_frame $frame)
$data = $frame-&
if($data=="workStart") {
echo "fd:".$frame-&fd."is work fd";
Cache::set("workFd",$frame-&fd,60*60*24);
$workFd = Cache::get("workFd");
if(!empty($workFd)&&$frame-&fd!=$workFd){
$server-&push($workFd,$frame-&data);
// 连接关闭时回调函数
public function onClose($server, $fd)
$workFd = Cache::get("workFd");
if(!empty($workFd)&&$workFd==$fd){
Cache::rm("workFd");
echo "client {$fd} closed\n";
var wsServer = 'ws://XXX.XXX.XXX.XXX:10000';
//调用websocket对象建立连接:
//参数:ws/wss(加密)://ip:port (字符串)
var websocket = new WebSocket(wsServer);
//onopen监听连接打开
websocket.onopen = function (evt) {
websocket.send("workStart");
//监听连接关闭
websocket.onclose = function (evt) {
console.log("Disconnected");
//onmessage 监听服务器数据推送
websocket.onmessage = function (evt) {
console.log('Retrieved data from server: ' + evt.data);
setInterval(function () {
websocket.send(Date.parse(new Date()));
'daemonize'
=& false,服务端启动后,大概1个小时左右的时间内服务端和客户端的通信是正常的,之后客户端就无法在连接到服务端,通过centos命令 查看服务端的进程是存在的,只能通过kill的方式杀掉服务,并重启,客户端又可以连接到服务端当
'daemonize'
=& ture,服务端启动后,客户端始终无法连接到服务端
请问要怎么解决
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1、更新版本2、检查进程状态3、检查socket连接状态(比如close_wait)4、内核调优...
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。聊聊swoole的心跳-微众圈
微众圈,我的微信生活圈!
聊聊swoole的心跳
摘自公众号:发布时间: 9:53:25
导读:swoole是PHP的异步、并行、高性能网络通信引擎,使用C编写,提供了PHP的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。本文为桶哥为大家讲述关于swoole的心跳功能。 swoole提供了一个心跳的功能,很多朋友感到困惑。 心跳是什么? 顾名思义,心跳是判断一个事物生还是死的一个标准,在swoole里,心跳是指用来判断一个连接是正常还是断开的。 从TCP协议说起 我们都知道一个五元组标识一个网络连接,创建一个连接有三次握手,而断开一个连接有四次挥手。不管是服务器还是客户端发起连接的关闭,都会完整的走完四次挥手的过程,这样,一切很完美,系统回收这个fd,应用层也可以通过onClose回调处理相关的事情. fd是什么? fd学名是文件描述符,在unix的哲学就是一切皆文件中,这个fd就是系统层暴露给业务层的用来表示一个五元组网络连接的标识。你可以简单的理解为一个索引,通过对这个fd的操作,系统层可以找到相应的连接而且进行的一系列操作,如发送数据到网瞳,进行连接关闭等等。 为什么要心跳?刚才提到,如果我们要关闭某个连接,我们可以在业务层对fd发起关闭连接的操作,以swoole为例: $server-&close($fd); 正常情况下,都会走完整个四次挥手,(swoole会有onClose回调),系统回收fd,以待分配给其他的连接。那系统为什么要回收fd,因为fd资源是有限的,所以必需重复利用。但在某些情况下,如突然拔掉网线或蓝翔演习挖断光缆,服务端并不能感知到这个连接的异常,但实际上是这个连接已经失效了,如果没有一个回收机制,这类连接将用光所有的fd,导致系统不再能接受新的连接请求,所以就有了心跳机制。 什么是心跳机制? 心跳机制就是业务层来提供一个连接是否存活的一个方法,让系统能判定一个连接是否失效。一般有两种实现方式:1: 客户端定时发送一个心跳包,告诉服务器我还活着,服务器定时检测所有客户端列表,看他们最后一个心跳包的时间是否过长,如果过长,则认为已无心跳,判定为死连接,主动关闭这个连接。 2: 服务器定时询问所有的客户端,你们还活着么?如果活着,给我个回馈,没得到回馈的客户端,格杀勿论。 两种心跳方案有什么区别?第一种方案,对服务器和网络的压力更小,而且更具有灵活性,但需要客户端配合定时发送心跳包。第二种方案,对服务器和网络压力更大,不建议使用。 心跳在swoole里的实现: swoole采用的是第一种方案swoole会在主进程独立起一个心跳线程,通过定时轮询所有的连接,来判断连接的生死,所以swoole的心跳不会堵塞任何业务逻辑。那怎么判断连接的生死了?swoole在connection结构体中有 time_t last_time 字段,用来存放最后一次收包的时间戳,进而通过与这个时间对比来判定是否存活。于是,swoole有两个配置: heartbeat_check_interval: 服务器定时检测在线列表的时间heartbeat_idle_time: 连接最大的空闲时间 (如果最后一个心跳包的时间与当前时间之差超过这个值,则认为该连接失效) 配置建议建议 heartbeat_idle_time 为 heartbeat_check_interval 的两倍多一点。这个两倍是为了进行容错,允许丢一个包而多一点是考虑到网络的延时。你可以跟据实际的业务来调整这个容错率(允许丢几个包)。补充1、系统层面也提供心跳机制,只不过粒度相对比较粗,而且时间稍长,没有应用层灵活2、swoole还提供ping的功能,通过配置ping值,swoole内核可以判断只是一个心跳包,而不会,也没必要把数据包转发应用层(onReceive)。3、心跳不只是swoole独有,大多数tcp的网络服务都会考虑到这个问题 关于21CTO21CTO.com是中国互联网第一技术社交与服务平台。 为CTO、技术总监,技术专家,架构师、技术经理,高级研发工程师、PM等提供学习成长,教育培训,工作机会、人脉影响力等高价值的技术、媒体、社交与服务平台。
微信号:we21cto对于 workerman、swoole 之类的用 php 做服务端 socket 长连接服务有什么忠告吗? - V2EX
对于 workerman、swoole 之类的用 php 做服务端 socket 长连接服务有什么忠告吗?
14:31:49 +08:00 &cevincheung
手机码字不容易,全在标题了
1037 次点击所在节点 &
ijustdo 11:36:11 +08:00主要看你们运维吧 如果 linux 肯定改内核参数 比喻 timewait 等的参数 连接端口复用
再牛的 就是 前面 nginx 只能的做 tcp udp 的反向代理 后面多台负载均衡
cevincheung 11:41:56 +08:00@
现在用 haproxy 做负载,后面多台 swoole
zcg121314 00:00:58 +08:00@ 狗逼 英晨 nodo.js ZeroMQ 很简单 socket
第 1 页 / 共 1 页&
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到
上打开本讨论主题的完整版本。
是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
is a community of developers, designers and creative people.

我要回帖

更多关于 swoole websocket ssl 的文章

 

随机推荐