Websockets 在线部署
Posted
技术标签:
【中文标题】Websockets 在线部署【英文标题】:Websockets online deployment 【发布时间】:2012-06-13 10:30:46 【问题描述】:我正在从事一个涉及 websockets 的网络开发项目。 在本地服务器上一切正常,使用 wamp 服务器。
在线出现问题,专用服务器已为 websocket 配置好(激活了 php 扩展),我可以毫无问题地运行服务器。
但连接失败,客户端无法连接。这不是端口或防火墙的问题,客户端可以访问服务器但握手未完成。
我使用PHPWebSocket:
关于在网络服务器上部署 websockets 的文档并不多,它在本地通常可以正常工作。
如果有人遇到同样的问题或知道出了什么问题...
【问题讨论】:
你确定没有防火墙或路由?一些代理(如 mod_proxy)可能会破坏 websocket 通信。 防火墙是否应该直接阻止连接? 它可能无法正确传输它,如果它不知道如何处理这种特定情况并且对 http 做出不正确(过时)的假设。我确定某些代理不兼容,我不知道防火墙,但它可能是可能的。 如何确定这不是防火墙问题?而代理呢? 对于防火墙,如果您怀疑是客户端,请从另一点进行测试。关于服务器防火墙和代理,你不知道你用的是什么吗? 【参考方案1】:问题已解决
PHPwebsocket 使用 ID 来区分客户端和关联的套接字。
所以,在 $this->read 中,我们有一些情侣:
clientID => 套接字
问题就在这里,函数socket_select不关心id。所以取决于实现...
在本地 (Windows)
输入:
0 => ressource #5,
1 => ressource #6
输出:
**1** => ressource #6
在线 (Debian)
输入:
0 => ressource #5,
1 => ressource #6
输出:
**0** => ressource #6
关系在第二种情况下不再保持,这会导致其余过程出现问题。
为了解决这个问题,我添加了一个循环来重新定义 id :
foreach($this->wsRead as $id => $socket2)
if($socket2 ==$socket)
$clientID = $id;
循环后 $clientID 设置为正确的值。
【讨论】:
以上是关于Websockets 在线部署的主要内容,如果未能解决你的问题,请参考以下文章
使用 nginx 和 daphne 部署 django、channels 和 websockets
如何在Heroku免费计划上部署laravel-websockets服务器?
在 Heroku 上部署 Flask Websockets 应用程序时遇到问题