Ich habe einen Knoten WebSockets Server alle eingerichtet mit einem Chat-Dienst funktioniert super. Aber ich möchte, dass ein LAMP-Server regelmäßig Nachrichten an Benutzer senden kann, die mit dem Websocket-Server verbunden sind. (Entweder als Antwort auf Benutzer-Browser-Aktionen oder Cron-Jobs). Also brauchte ich PHP-Code, um eine Anfrage an den Node-Server zu senden (beide auf Google Compute Engine).fsockopen Verbindung bleibt offen
ich über diese Antwort gefunden: https://stackoverflow.com/a/22411059/947374 ... ein Link zu einem Forum, in dem jemand diese ziemlich gut ausstieg gearbeitet: https://forum.ripple.com/viewtopic.php?f=2&t=6171&p=43313#p43313
Mein jetzt PHP-Code wie folgt aussieht:
//local address of node server
$host='XXX.XXX.XXX.XXX';
$port=80;
//location where THIS script is running FROM
$local="http://localhost";
//json the data to send
$data=json_encode($data);
//some very particular headers
$head = "GET/HTTP/1.1"."\r\n".
"Upgrade: WebSocket"."\r\n".
"Connection: Upgrade"."\r\n".
"Origin: $local"."\r\n".
"Host: $host"."\r\n".
"Sec-WebSocket-Version: 13"."\r\n".
"Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
"Content-Length: ".strlen($data)."\r\n"."\r\n";
//WebSocket handshake
$sock = fsockopen($host, $port, $errno, $errstr, 2);
fwrite($sock, $head) or die('error:'.$errno.':'.$errstr);
$headers = fread($sock, 2000);
//see the second link above for what hybi10Encode() is doing
fwrite($sock, hybi10Encode($data)) or die('error:'.$errno.':'.$errstr);
$wsdata = fread($sock, 2000);
fclose($sock);
Die Daten wird von PHP an Knoten gesendet. Schön. Preiset den Herrn.
Das einzige Problem ist, dass die Verbindung für etwa 60 Sekunden geöffnet bleibt. Die Daten werden sofort von PHP an Knoten gesendet, der Webchat antwortet sofort wie ich es möchte. Die Browser-Registerkarte, die das PHP-Skript anfordert, wird für diese 60 Sekunden gedreht und nimmt keine weitere Anfrage an, bis die erste beendet ist.
Ich hatte gedacht, die Aufnahme von fclose() würde es so machen, dass die Verbindung nicht so offen bleibt.
Ich habe auch versucht die Header zu ändern zu: Anschluss: Schließen UND/ODER versucht GET/HTTP/1.0 (Stand ein paar Ratschläge von anderen Threads mit ähnlichen Problemen) Dies entweder nicht helfen.
Irgendwelche Ratschläge, wie ich das PHP-Skript dazu bringen kann, die Verbindung sofort zu schließen, oder der Node-Server die Verbindung vom LAMP-Server löscht, sobald es seine Anfrage bearbeitet hat?
Verwendet Ihr node.js-Dienst Redis oder einen anderen Pub/Sub-Dienst für die horizontale Skalierung? Wenn dies der Fall ist, können Sie wahrscheinlich den Dienst veröffentlichen, anstatt eine Verbindung zu node.js über Websockets herzustellen. – Myst