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


Setting up a Websocket Server without running a Daemon

这可能看起来像一个简单的问题,但它让我难以置信:假设我不能运行守护进程,我将如何设置websocket服务器?

(详细信息:Apache 2.2.21,PHP 5.3.9,所以最好使用 PHP)

由于不想要守护进程,我假设您要求在 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中,并支持协议的两个版本:

  • 蟒蛇:http://code.google.com/p/pywebsocket/

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

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

服务器需要作为守护程序运行...否则服务器有什么意义?

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

从操作方法:

// 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); }

您可能会将"服务器"作为长轮询的 Apache 请求运行。 您可以使用普通的Web浏览器来启动/控制它,但也可以使用Telnet或Curl。 与适当的 systemd 服务相比,它会很黑客,但它可以工作