在不运行守护进程的情况下设置 Websocket 服务器

Posted

技术标签:

【中文标题】在不运行守护进程的情况下设置 Websocket 服务器【英文标题】:Setting up a Websocket Server without running a Daemon 【发布时间】:2012-04-10 09:07:37 【问题描述】:

这可能看起来像一个简单的问题,但让我大吃一惊:假设我无法运行守护程序,我将如何设置 websocket 服务器?

(详情:Apache 2.2.21,php 5.3.9,所以最好用 PHP)

【问题讨论】:

仍然需要守护进程.. 像 ZeroMQ 【参考方案1】:

通过不想要守护进程,我假设您要求的是在 Apache/PHP 中运行的东西,而不是作为您必须运行的独立程序/服务器。

请注意,PHP 还没有一个很好的选择来同时支持旧的 Hixie WebSocket 协议和新的 HyBi/IETF 协议(大多数其他语言都有支持这两种协议的服务器)。

http://code.google.com/p/phpwebsocket/ 仅支持较旧的 Hixie 协议。这适用于 ios 设备(iPhone 和 iPad)。

http://code.google.com/p/php-websocket-server/ 仅支持大多数其他浏览器的最新版本支持的较新的 HyBi/IETF 协议。

如果您愿意考虑非 PHP 选项,这些项目可以集成到 Apache 中并支持协议的两个修订版:

Python:http://code.google.com/p/pywebsocket/

C:https://github.com/disconnect/apache-websocket

【讨论】:

【参考方案2】:

http://code.google.com/p/phpwebsocket/

服务器需要作为守护进程运行...否则服务器的意义何在?

【讨论】:

【参考方案3】:

也许http://code.google.com/p/phpwebsocket/可以帮到你。

从howto:

// Server side
log("Handshaking...");
list($resource,$host,$origin) = getheaders($buffer);
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
       "Upgrade: WebSocket\r\n" .
       "Connection: Upgrade\r\n" .
       "WebSocket-Origin: " . $origin . "\r\n" .
       "WebSocket-Location: ws://" . $host . $resource . "\r\n" .
       "\r\n";
$handshake = true;
socket_write($socket,$upgrade.chr(0),strlen($upgrade.chr(0)));


// Client side
var host = "ws://localhost:12345/websocket/server.php";
try
  socket = new WebSocket(host);
  log('WebSocket - status '+socket.readyState);
  socket.onopen    = function(msg) log("Welcome - status "+this.readyState); ;
  socket.onmessage = function(msg) log("Received: "+msg.data); ;
  socket.onclose   = function(msg) log("Disconnected - status "+this.readyState);     ;

catch(ex) log(ex); 

【讨论】:

【参考方案4】:

您可以将“服务器”作为长时间轮询的 apache 请求运行。您可以使用普通的网络浏览器来启动/控制它,但您也可以使用 telnet 或 curl。与适当的 systemd 服务相比,这将是 hacky,但它会工作

【讨论】:

欢迎来到 SO!尽量简洁...您提供的选项太多,因此请尝试更好地解释它们。

以上是关于在不运行守护进程的情况下设置 Websocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用另一个守护进程在生产模式下检查数据库完整性?

500内部错误Laravel,通过websocket守护进程获取图像

Kubernetes 可以在没有 LXD 守护进程的情况下管理 LXC 容器吗?

多线程默认情况,守护线程及join对子线程运行的影响

将进程设置为守护进程

Linux下怎么查看某个守护进程或者所有的守护进程?