Cómo integrar NodeJS + Socket.IO ¿y PHP?


Recientemente he estado buscando, para encontrar una buena manera de comunicarse entre NodeJS y PHP. Esta es la idea : NodeJS todavía es bastante nuevo, y puede ser un poco difícil desarrollar una aplicación completa solo con él. Además, es posible que lo necesite solo para un módulo de su proyecto, como notificaciones en tiempo real, chat,... Y desea administrar todas las demás cosas con PHP, porque probablemente sea más fácil para usted (y puede aprovechar los frameworks 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 servidores Apache y Node. Lo que quiero es poder capturar eventos desde el nodo en Javascript simple, del lado del cliente.

No encontré ninguna respuesta que estuviera completa, la mayor parte del tiempo del lado del cliente se ejecutaba en el servidor del nodo y, por lo tanto, no es aplicable en mi caso. Así que rastreé todos los temas posibles, y finalmente encontrar mi respuesta; voy a tratar de compartir esto, y para tener un punto donde está todo despejado.

Espero que esto pueda ayudar a algunas personas ! ;)

Author: Jérémy Dutheil, 2013-06-20

2 answers

Así que, para empezar, pongo 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 voy a hablar de código PHP, es realmente simple y no es interesante aquí; lo que quiero mostrar usted es cómo integrar su código NodeJS.

Uso express y Socket.IO, así que asegúrese de instalar esos módulos con npm. Luego, 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 nuestros eventos de devolución de llamada 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: del lado del cliente! Que la parte que me llevó la mayor parte del tiempo, porque no sabía qué script incluir para poder ejecutar Socket.IO código sin nodeServer (porque la página del cliente será servida por Apache).

Pero todo ya está hecho; cuando se instala Socket.IO módulo con npm, un script está disponible en /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js; que el script 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 terminar, mi nodeClient.js, donde simplemente nos conectamos al servidor del nodo y esperamos a 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 );
});

Trataré de actualizar y mejorar mi código lo antes posible, pero creo que ya abierto a todas las cosas interesantes! Estoy realmente abierto a consejos y comentarios sobre este material, es la buena manera de hacerlo, .. ?

Espero que esto pueda ayudar a algunas personas!

 128
Author: Jérémy Dutheil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-06 16:02:26

Tengo otra solución que funciona bastante bien para mí, pero me gustaría que alguien comentara lo efectiva que es, ya que (todavía) no he tenido la oportunidad/tiempo para probarlo 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á el simple fragmento 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 carga la página php, a su vez llama a la nodeserver.página js, que jsonify el objeto knall.

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

El servidor 'real' se ejecuta en ubuntu.

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

 2
Author: Snorvarg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-14 08:41:34