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 应用程序时遇到问题

如何在共享主机上部署 laravel websockets?

PHP 共享主机上的 WebSockets

Elastic Beanstalk 上的 WebSockets 与 Docker