php - rooms - socket io js client library
PHP Socket Server vs node.js: Web Chat (2)
Quiero programar un WebChat HTTP utilizando solicitudes HTTP de larga duración (Comet), ajax y websockets (según el navegador utilizado). Userdatabase está en mysql. El chat está escrito en PHP, excepto tal vez el flujo de chat en sí mismo, que también podría escribirse en javascript (node.js):
No quiero iniciar un proceso php por usuario, ya que no hay una buena manera de enviar mensajes de chat entre estos niños php. Así que pensé en escribir un servidor de socket propio en PHP o node.js que debería poder manejar más de 1000 conexiones (usuarios de chat). Como desarrollador puramente web (php) no estoy muy familiarizado con los sockets ya que generalmente dejo que el servidor web se preocupe por las conexiones. Los mensajes de chat no se guardarán en el disco ni en mysql sino en la RAM como una matriz u objeto para la mejor velocidad.
Por lo que sé, no hay forma de manejar varias conexiones al mismo tiempo en un solo proceso php (servidor de socket), sin embargo, puede aceptar una gran cantidad de conexiones de socket y procesarlos sucesivamente en un bucle (leer y escribir; entrante mensaje -> escribir en todas las conexiones de socket). El problema es que probablemente habrá un retraso con ~ 1000 usuarios y las operaciones de mysql podrían ralentizar todo el proceso, lo que afectará a todos los usuarios.
Mi pregunta es: ¿puede node.js manejar un servidor de socket con mejor rendimiento? Node.js está basado en eventos, pero no estoy seguro de si puede procesar varios eventos al mismo tiempo (¿no necesitaría eso multiproceso?) O si solo hay una cola de eventos. Con una cola de eventos sería como php: process usuario tras usuario.
También podría generar un proceso php por sala de chat (y mucho menos usuarios), pero afaik hay servidores IRC de cadena única que también son capaces de manejar miles de usuarios. (escrito en c ++ o lo que sea) así que quizás también sea posible en php.
Preferiría PHP sobre Node.js porque entonces el proyecto sería solo para PHP y no una mezcla de lenguajes de programación. Sin embargo, si Node puede procesar conexiones simultáneamente, probablemente lo elija.
JavaScript, o en este caso V8, que es el motor que utiliza Node, es por diseño de un solo hilo. Así que sí, solo hay una cola de eventos.
Pero al final, eso no es un problema, siempre sucederá algo primero, a menos que esté usando varios procesadores, e incluso entonces, lo más probable es que solo tenga una tarjeta de red ... un enrutador ... entienda la idea. Además, al utilizar más de 1000 subprocesos ... no es una buena idea, se escala mal y te encontrarás en un HELL de concurrencia.
1000 usuarios de chat, eso no será un problema para Node.js.
Puedo darte una idea bastante básica de cómo lo configurarías, esta simple charla de vainilla funciona a través de telnet, no tiene ... características, pero funciona:
var net = require(''net''); // require the net module
var users = []; // keep track of the users
// setup a new tcp socket server
net.createServer(function(socket) { // provide a callback in case a new connection gets
// established, socket is the socket object
// keep track of this users names, via use of closures
var name = '''';
// ask the new user for a name
socket.write(''Enter a Name(max 12 chars): '');
// register a callback on the socket for the case of incoming data
socket.on(''data'', function(buffer) { // buffer is a Buffer object containing the data
if (name !== '''') { // in case this user has a name...
// send out his message to all the other users...
for(var i = 0; i < users.length; i++) {
if (users[i] !== socket) { // ...but himself
users[i].write(name + '': ''
+ buffer.toString(''ascii'').trim()
+ ''/r/n'');
}
}
// otherwise take the data and use that as a name
} else {
name = buffer.toString(''ascii'').substring(0, 12).trim().replace(//s/g, ''_'');
socket.write(''> You have joined as '' + name + ''/r/n'');
// push this socket to the user list
users.push(socket);
for(var i = 0; i < users.length; i++) {
if (users[i] !== socket) {
users[i].write(''> '' + name + '' has joined'' + ''/r/n'');
}
}
}
});
// another callback for removing the user aka socket from the list
socket.on(''end'', function() {
users.splice(users.indexOf(socket), 1);
});
// bind the server to port 8000
}).listen(8000);
No hay magia involucrada aquí (además del uso de closures ), no tiene que ver con la programación de socket en bruto y no tendrá ningún problema de concurrencia. Y aprendes algo del último picor;)
Le recomiendo que vea algunas de las charlas que se enumeran en nuestra etiqueta wiki Node.js , para comprender mejor cómo funciona Node.js.
Otro tema que respondí que podría ayudarlo y se ampliará fácilmente a sus necesidades => ¿Cómo usar redis PUBLISH / SUBSCRIBE with nodejs para notificar a los clientes cuando cambian los valores de los datos?