How to integrate nodeJS + Socket.IO and PHP?

前端 未结 3 1349
再見小時候
再見小時候 2020-11-27 09:11

I have recently been looking around, to find a good way to communicate between nodeJS and PHP. Here is the idea : nodeJS is still quite new, and it can be kind of tricky to

相关标签:
3条回答
  • 2020-11-27 09:36

    Try similar or you can check my blog for complete sample code on nodejs


    On your page side:

    • Load Socket JS

    https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js

    • Make object of the socket

    var socket = io();

    • Use the emit function to send data to nodeserver.

    socket.emit('new_notification', {
    message: 'message',
    title: 'title',
    icon: 'icon',
    });

    So now your code will be look like

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
    
    var socket = io(); 
    
    $(document).ready(function($) {
      $('.rules-table').on('click', '.runRule', function(event) {
        event.preventDefault();
        /* Act on the event */
        var ruleID = $(this).parents('tr').attr('id');
    
        // send notification before going to post 
        socket.emit('new_notification', {
            message: 'Messge is ready to sent',
            title: title,
            icon: icon,
        });
        $.ajax({
          url: '/ajax/run-rule.php',
          type: 'POST',
          dataType: 'json',
          data: {
            ruleID: ruleID
          },
        })
        .done(function(data) {
          console.log(data);
    
          // send notification when post success 
          socket.emit('new_notification', {
            message: 'Messge was sent',
            title: title,
            icon: icon,
          });
    
        })
        .fail(function() {
          console.log("error");
    
          // send notification when post failed 
          socket.emit('new_notification', {
            message: 'Messge was failed',
            title: title,
            icon: icon,
          });
        })
        .always(function() {
          console.log("complete");
        });
    
      });
    });
    

    Now on Node server side make handler for your request to get your request and send a message to all connected devices/browsers(server.js)

    var app = require('express')();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    
    app.get('/', function(req, res) {
       res.sendfile('index.html');
    });
    
    
    io.on('connection', function (socket) {
      socket.on( 'new_notification', function( data ) {
        console.log(data.title,data.message);
    
        // Now Emit this message to all connected devices
        io.sockets.emit( 'show_notification', { 
          title: data.title, 
          message: data.message, 
          icon: data.icon, 
        });
      });
    });
    
    http.listen(3000, function() {
       console.log('listening on localhost:3000');
    });
    

    Now the client/browser/client side make a receiver to receive socket message from node server

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>   
    
    var socket = io();
    
    /**
     * Set Default Socket For Show Notification
     * @param {type} data
     * @returns {undefined}
     */
    socket.on('show_notification', function (data) {
        showDesktopNotification(data.title, data.message, data.icon);
    });
    /**
     * Set Notification Request
     * @type type
     */
    function setNotification() {
        showDesktopNotification('Lokesh', 'Desktop Notification..!', '/index.jpeg');
        sendNodeNotification('Lokesh', 'Browser Notification..!', '/index.jpeg');
    }
    /**
     * Check Browser Notification Permission
     * @type window.Notification|Window.Notification|window.webkitNotification|Window.webkitNotification|Window.mozNotification|window.mozNotification
     */
    var Notification = window.Notification || window.mozNotification || window.webkitNotification;
    Notification.requestPermission(function (permission) {
    });
    /**
     * Request Browser Notification Permission 
     * @type Arguments
     */
    function requestNotificationPermissions() {
        if (Notification.permission !== 'denied') {
            Notification.requestPermission(function (permission) {
            });
        }
    }
    /**
     * Show Desktop Notification If Notification Allow
     * @param {type} title
     * @param {type} message
     * @param {type} icon
     * @returns {undefined}
     */
    function showDesktopNotification(message, body, icon, sound, timeout) {
        if (!timeout) {
            timeout = 4000;
        }
        requestNotificationPermissions();
        var instance = new Notification(
                message, {
                    body: body,
                    icon: icon,
                    sound: sound
                }
        );
        instance.onclick = function () {
            // Something to do
        };
        instance.onerror = function () {
            // Something to do
        };
        instance.onshow = function () {
            // Something to do
        };
        instance.onclose = function () {
            // Something to do
        };
        if (sound)
        {
            instance.sound;
        }
        setTimeout(instance.close.bind(instance), timeout);
        return false;
    }
    
    0 讨论(0)
  • 2020-11-27 09:39

    I have another solution that works quite well for me, but I would like someone to comment about how effective it is, as I have not (yet) had the opportunity/time to test it on the real server.

    Here goes the node-js code. I put this code in a file called 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);  
    

    And here is the simple piece of code in php, calling the node-js server with the help of file_get_contents():

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

    Works great, when I load the php-page, it in turn calls the nodeserver.js page, which jsonify the knall-object.

    I have two localhost-installations running on iis on windows 10, one standard php-server, and the nodejs-server works with the neat iisnode package.

    The 'real' server is run on ubuntu.

    I think this is a neat and easy solution for communication between two servers, but maybe someone has any comments about it?

    0 讨论(0)
  • 2020-11-27 09:55

    So, to begin with, I put my project on github, if you want access to the full code: https://github.com/jdutheil/nodePHP

    It is a very simple example project: a web chat. You just have an author and message, and when you press send it is saved in a mysql database. The idea is to send real time updates, and have a real conversation. ;) We'll use nodeJS for that.

    I won't talk about PHP code, it is really simple and not interesting here; what I want to show you is how to integrate your nodeJS code.

    I use express and Socket.IO, so be sure to install those modules with npm. Then, we create a simple nodeJS server:

    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 );
    

    We registered our events callback when a new user is connected ; every time we receive a message (represents a chat message), we broadcast it to every users connected. Now, the tricky part: client-side! That the part that took me most of the time, because I didn't know which script include to be able to run Socket.IO code without the nodeServer (because client page will be served by Apache).

    But everything is already done; when you install Socket.IO module with npm, a script is available in /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js; that the script we will include in our PHP page, in my case:

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

    And to finish, my nodeClient.js, where we simply connect to the node server and wait for event to update our page. ;)

    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 );
    });
    

    I'll try to update and improve my code as soon as possible, but I think it already open to all of cool things! I am really open for advice and reviews on this stuff, is it the good way to do it, .. ?

    Hope this can help some people!

    0 讨论(0)
提交回复
热议问题