socket elephant php node.js socket.io real-time

elephant - ¿Cómo integrar nodeJS+Socket.IO y PHP?



elephant io (2)

Entonces, para empezar, puse mi proyecto en github, si quieres acceder al código completo: https://github.com/jdutheil/nodePHP

Es un proyecto de ejemplo muy simple: un chat web. Solo tiene un autor y un mensaje, y cuando presiona enviar se guarda en una base de datos mysql. La idea es enviar actualizaciones en tiempo real y tener una conversación real. ;) Usaremos nodeJS para eso.

No hablaré sobre el código PHP, es realmente simple y no interesante aquí; lo que quiero mostrarte es cómo integrar tu código nodeJS.

Utilizo Express y Socket.IO, así que asegúrese de instalar esos módulos con npm. Entonces, creamos un servidor nodeJS simple:

var socket = require( ''socket.io'' ); var express = require( ''express'' ); var http = require( ''http'' ); var app = express(); var server = http.createServer( app ); var io = socket.listen( server ); io.sockets.on( ''connection'', function( client ) { console.log( "New client !" ); client.on( ''message'', function( data ) { console.log( ''Message received '' + data.name + ":" + data.message ); io.sockets.emit( ''message'', { name: data.name, message: data.message } ); }); }); server.listen( 8080 );

Registramos la devolución de llamada de nuestros eventos cuando un nuevo usuario está conectado; cada vez que recibimos un mensaje (representa un mensaje de chat), lo transmitimos a todos los usuarios conectados. Ahora, la parte difícil: ¡lado del cliente! Esa es la parte que me llevó la mayor parte del tiempo, porque no sabía qué script incluir para poder ejecutar el código Socket.IO sin el nodeServer (porque la página del cliente será servida por Apache). Pero todo ya está hecho; cuando instala el módulo Socket.IO con npm, hay un script disponible en /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js ; que el script lo incluiremos en nuestra página PHP, en mi caso:

<script src="js/node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js"></script> <script src="js/nodeClient.js"></script>

Y para finalizar, mi nodeClient.js, donde simplemente nos conectamos al servidor de nodo y esperamos que el evento actualice nuestra página. ;)

var socket = io.connect( ''http://localhost:8080'' ); $( "#messageForm" ).submit( function() { var nameVal = $( "#nameInput" ).val(); var msg = $( "#messageInput" ).val(); socket.emit( ''message'', { name: nameVal, message: msg } ); // Ajax call for saving datas $.ajax({ url: "./ajax/insertNewMessage.php", type: "POST", data: { name: nameVal, message: msg }, success: function(data) { } }); return false; }); socket.on( ''message'', function( data ) { var actualContent = $( "#messages" ).html(); var newMsgContent = ''<li> <strong>'' + data.name + ''</strong> : '' + data.message + ''</li>''; var content = newMsgContent + actualContent; $( "#messages" ).html( content ); });

Intentaré actualizar y mejorar mi código lo antes posible, pero creo que ya está abierto para todas las cosas interesantes. Estoy realmente abierto para recibir consejos y comentarios sobre este tema, ¿es la mejor manera de hacerlo, ...?

Espero que esto pueda ayudar a algunas personas!

Recientemente he estado buscando, para encontrar una buena manera de comunicarme entre nodeJS y PHP. Aquí está la idea: nodeJS todavía es bastante nuevo, y puede ser complicado desarrollar una aplicación completa solo con él. Además, puede necesitarlo solo para un módulo de su proyecto, como notificaciones en tiempo real, chat, ... Y desea administrar todo lo demás con PHP, porque probablemente sea más fácil para usted (y puede aprovecharlo los marcos existentes, como CodeIgniter o Symfony).

Me gustaría tener una solución fácil; No quiero usar cURL o un tercer servidor para comunicarse entre los servidores Apache y Node. Lo que quiero es poder capturar eventos desde un nodo en Javascript simple, desde el lado del cliente.

No encontré ninguna respuesta que se haya completado, la mayoría de las veces el lado del cliente se ejecutaba en el servidor de nodos y, por lo tanto, no se aplica en mi caso. Así que rastreé todos los temas posibles y finalmente encontré mi respuesta; Intentaré compartir esto y tener un punto donde todo esté claro.

Espero que esto pueda ayudar a algunas personas! ;)


Tengo otra solución que funciona bastante bien para mí, pero me gustaría que alguien comentara qué tan efectiva es, ya que todavía no tuve la oportunidad / el tiempo para probarla en el servidor real.

Aquí va el código node-js. Puse este código en un archivo llamado nodeserver.js:

var http = require(''http''); http.createServer(function (req, res) { res.writeHead(200, {''Content-Type'': ''text/html''}); var knall = new Object(); knall.totten = "4 tomtar"; knall.theArr = new Array(); knall.theArr.push("hoppla") knall.theArr.push("hej") var strKnall = JSON.stringify(knall); res.end(strKnall); }).listen(process.env.PORT);

Y aquí está la simple pieza de código en php, llamando al servidor node-js con la ayuda de file_get_contents ():

$json = file_get_contents(''http://localhost:3002/knall.json''); $obj = json_decode($json);

Funciona muy bien, cuando cargo la página php, a su vez llama a la página nodeserver.js, que jsonify the knall-object.

Tengo dos instalaciones localhost ejecutándose en iis en Windows 10, un servidor php estándar, y el nodejs-server funciona con el paquete iisnode ordenado.

El servidor ''real'' se ejecuta en ubuntu.

Creo que esta es una solución clara y fácil para la comunicación entre dos servidores, pero tal vez alguien tiene algún comentario al respecto?