这可能看起来像一个简单的问题,但让我大吃一惊:假设我无法运行守护进程,我将如何设置 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/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 请求运行。您可以使用普通的网络浏览器来启动/控制它,但您也可以使用 telnet 或 curl。与适当的 systemd 服务相比,这将是 hacky,但它会起作用