Ich versuche, meinen Kopf um node.js zu bekommen …
Ich bin sehr zufrieden mit meinem LAMP-Setup, da es derzeit meine Anforderungen erfüllt. Obwohl ich meiner PHP-App einige Echtzeitfunktionen hinzufügen möchte. Beispielsweise das Anzeigen aller Benutzer, die derzeit auf meiner Website angemeldet sind, und möglicher Chat-Funktionen.
Ich möchte mein PHP-Backend nicht ersetzen, aber ich möchte skalierbare Echtzeitlösungen.
1. Kann ich node.js in den Mix werfen, um meine Anforderungen zu erfüllen, ohne das gesamte serverseitige Skript der Anwendung neu zu erstellen?
2. Wie könnte node.js meine „Chat“- und „Aktuell eingeloggt“-Funktionen am besten bedienen?
Schön, Ihre Ansichten zu hören!
W.
Bausatz
Ich schlage vor, dass Sie Socket.io zusammen mit node.js verwenden. Installieren und laden Sie die Bibliotheken von herunter http://socket.io/. Sie können es problemlos neben Ihrem Apache-Server ausführen.
Erstellen Sie zuerst einen Node-Server:
var http = require('http')
, url = require('url')
, fs = require('fs')
, io = require('../')//path to your socket.io lib
, sys = require(process.binding('natives').util ? 'util' : 'sys')
, server;
server = http.createServer(function(req, res){
var path = url.parse(req.url).pathname;
}),
server.listen(8084);//This could be almost any port number
Führen Sie zweitens Ihren Server von der Befehlszeile aus mit:
node /path/to/your/server.js
Stellen Sie drittens eine Verbindung zum Socket mit clientseitigem js her:
var socket = new io.Socket(null, {port: 8084, rememberTransport: false});
socket.connect();
Sie müssen auch die Socket.io-Lib-Clientseite einbeziehen.
Senden Sie Daten von der Clientseite an den Knotenserver mit:
socket.send({data:data});
Ihre server.js sollte auch Funktionen zum Verarbeiten von Anfragen haben:
io.on('connection', function(client){
//action when client connets
client.on('message', function(message){
//action when client sends msg
});
client.on('disconnect', function(){
//action when client disconnects
});
});
Es gibt zwei Möglichkeiten, Daten vom Server an den Client zu senden:
client.send({ data: data});//sends it back to the client making the request
und
client.broadcast({ data: data});//sends it too every client connected to the server
Hallo @Kit danke für diese tolle Antwort. Ich bin immer noch ein wenig verwirrt über die Verbindung zum Apache-Teil. Würde es Ihnen etwas ausmachen, Ihrer Antwort einige Kommentare/Code hinzuzufügen, um den Apache-Teil klarer zu machen?
– Tim Petersen
21. Juli 2012 um 18:30 Uhr
Was ist mit der Richtlinie zur gleichen Herkunft? Sie können mit Socket io keine Anrufe an einen anderen Port tätigen, oder?
– Zaptree
8. August 2012 um 17:50 Uhr
Danke hat sehr geholfen beim Einstieg
– Luftig
27. Januar 2014 um 15:34 Uhr
@KitCarrau wenn wir eine PHP-Erweiterungsdatei haben, zB -> index.php dann brauchen wir Apache, um es auszuführen und gleichzeitig, wenn wir unsere socket.io laden müssen <script> auf Clientseite -> index.php unsere zu aktivieren node.js und socket.io Feature, das es nicht funktioniert. Ein Grund ist port wo wir Apache und nodejs nicht verwenden können port no. gleich
– SOuřaan Gřg
23. Dezember 2015 um 17:12 Uhr
und wenn wir für diese beiden separaten Server unterschiedliche Ports verwenden möchten apache und nodejs wie können wir dann unsere zusammen laufen lassen php und nodejs ??
– SOuřaan Gřg
23. Dezember 2015 um 17:14 Uhr
Ich vermute, dass sowohl der Chat als auch das eingeloggte Verzeichnis über Ajax funktionieren würden.
Der Chat-Teil wäre ziemlich einfach in Node.js zu programmieren, verwenden Sie einen der MySQL-Module Damit Node eine Verbindung zu Ihrer vorhandenen Datenbank herstellt und Anmeldeinformationen und dergleichen abfragt und dann den gesamten eigentlichen Chat über Node.js durchführt, empfehle ich Ihnen, es auszuprobieren Socket.io Da es die Kommunikation zwischen Browser und Node.js wirklich trivial macht, sollten Sie sich auf die eigentliche Chat-Logik konzentrieren können.
Sie können auch einen Blick auf die “offiziellen” Chat-Demo von Node.js, für etwas Inspiration.
Was den aktuellen Online-Teil angeht, ist dies nie einfach zu implementieren, da Sie nur etwas in der Art von “5 Benutzer aktiv in den letzten X Minuten” anzeigen können.
Natürlich könnten Sie leicht etwas Ajax hinzufügen, das den Chat-Server abfragt und die Benutzerliste davon auf der Homepage anzeigt.
Oder Sie sind völlig verrückt und bauen für jeden Besucher eine Socket.io-Verbindung auf und überwachen sie so, obwohl fraglich ist, ob sich der Aufwand lohnt.
Wäre er nicht gezwungen, den node.js-Server auf einem anderen Port auszuführen, da Port 80 bereits von Apache verwendet wird, oder ihn an eine andere IP binden? Er würde dann auf domänenübergreifende Probleme stoßen, wenn er jemals mit dem Chat-Server und seiner aktuellen Web-App kommunizieren wollte. Ich könnte mich irren, aber ich glaube, das war im Wesentlichen seine Frage.
Interessanter Fund. Einer der Kommentare zu diesem Beitrag schlägt vor, das Gegenteil zu tun. Das heißt, dass node.js das Proxying an Apache durchführt, anstatt umgekehrt. Wenn Sie Apache als Proxy für node.js verwenden, erzeugt Apache bei jeder Anfrage einen neuen Prozess und leitet ihn an node.js weiter.
Ich betreibe neben meinem LAMP-Setup einen wss-Server (secure websocket).
Node.js kann problemlos neben jedem anderen gewünschten Webserver (Apache) ausgeführt werden. Im Beispiel von @KitCarrau lässt er den Knoten auf Port 8084 laufen – dort läuft und hört er, nicht 80 oder 443 usw. (diese werden normalerweise sowieso von Apache übernommen). Aber Sie können immer noch denselben Port verwenden, um auch http/https zu bedienen (in meinem Fall geben Sie nur einige conf und allgemeine Informationen an, dass der Dienst aktiv ist).
Das Starten von der Konsole aus ist nicht der beste Weg (aus der Ferne stoppt der Knoten beim Schließen der Konsole). Ich empfehle einen Blick auf Knoten als Dienst ausführen
Einfach zu verfolgendes Protokoll in Echtzeit (Protokoll mit console.log(“hello”); in Ihrer Anwendung) mit:
tail -f /var/.../SocketServer.log
Beispielskript (node-server.conf):
author ....
description "node.js server"
# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown
# Automatically Respawn:
respawn
respawn limit 99 5
# Max open files are @ 1024 by default. Bit few.
limit nofile 32768 32768
script
# Not sure why $HOME is needed, but we found that it is:
export HOME="/root"
exec node /var/.../SocketServer.js >> /var/www/node/.../SocketServer.log 2>&1
end script
post-start script
# Optionally put a script here that will notifiy you node has (re)started
# /root/bin/hoptoad.sh "node.js has started!"
echo "\n*********\nServer started\n$(date)\n*********" >> /var/.../SocketServer.log
end script
11581400cookie-checknode.js läuft neben Apache PHP?yes