it-swarm.com.de

Wie kann man nodeJS + Socket.IO und PHP integrieren?

Ich habe mich kürzlich umgesehen, um einen guten Weg zu finden, um zwischen nodeJS und PHP zu kommunizieren. Hier ist die Idee: nodeJS ist noch ziemlich neu und es kann schwierig sein, eine vollständige Anwendung nur damit zu entwickeln. Darüber hinaus benötigen Sie es möglicherweise nur für ein Modul Ihres Projekts, z. B. Echtzeitbenachrichtigungen, Chat, ... Und Sie möchten alle anderen Dinge mit PHP verwalten, da dies für Sie wahrscheinlich einfacher ist (und Sie die Vorteile nutzen können) die vorhandenen Frameworks wie CodeIgniter oder Symfony).

Ich hätte gerne eine einfache Lösung. Ich möchte kein cURL oder einen dritten Server für die Kommunikation zwischen Apache und Node) -Servern verwenden. Ich möchte, dass Ereignisse von Node in einfachem Javascript clientseitig abgefangen werden können.

Ich habe keine Antworten gefunden, die vollständig waren, da die meiste Zeit clientseitig vom Knotenserver ausgeführt wurde und daher in meinem Fall nicht zutreffend war. Also durchsuchte ich alle möglichen Themen und fand schließlich meine Antwort; Ich werde versuchen, dies zu teilen und einen Punkt zu finden, an dem alles klar ist.

Hoffe das kann einigen Leuten helfen! ;)

98

Zu Beginn habe ich mein Projekt auf github gestellt, wenn Sie Zugriff auf den vollständigen Code haben möchten: https://github.com/jdutheil/nodePHP

Es ist ein sehr einfaches Beispielprojekt: ein Web-Chat. Sie haben nur einen Autor und eine Nachricht, und wenn Sie auf Senden klicken, wird diese in einer MySQL-Datenbank gespeichert. Die Idee ist, Echtzeit-Updates zu senden und ein echtes Gespräch zu führen. ;) Dafür verwenden wir nodeJS.

Ich werde nicht über PHP Code sprechen, es ist wirklich einfach und hier nicht interessant; ich möchte Ihnen zeigen, wie Sie Ihren nodeJS-Code integrieren.

Ich benutze Express und Socket.IO, also stelle sicher, dass du diese Module mit npm installierst. Dann erstellen wir einen einfachen 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 );

Wir haben unseren Ereignis-Rückruf registriert, wenn ein neuer Benutzer verbunden ist. Jedes Mal, wenn wir eine Nachricht erhalten (die eine Chat-Nachricht darstellt), senden wir sie an alle verbundenen Benutzer. Nun der knifflige Teil: Client-Seite! Das war der Teil, der mich die meiste Zeit gekostet hat, weil ich nicht wusste, welches Skript enthalten ist, um Socket.IO-Code ohne den nodeServer ausführen zu können (weil die Clientseite von Apache bereitgestellt wird).

Aber alles ist schon erledigt; Wenn Sie das Socket.IO-Modul mit npm installieren, ist ein Skript in /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js verfügbar. dass das Skript, das wir in unsere PHP Seite einfügen, in meinem Fall:

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

Und zum Abschluss meine nodeClient.js, wo wir einfach eine Verbindung zum Knotenserver herstellen und auf das Ereignis warten, um unsere Seite zu aktualisieren. ;)

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

Ich werde versuchen, meinen Code so schnell wie möglich zu aktualisieren und zu verbessern, aber ich denke, er ist bereits offen für alle coolen Dinge! Ich bin wirklich offen für Ratschläge und Bewertungen zu diesem Thema. Ist das der richtige Weg, das zu tun?

Hoffe das kann einigen Leuten helfen!

130

Ich habe eine andere Lösung, die für mich ganz gut funktioniert, aber ich möchte, dass jemand kommentiert, wie effektiv sie ist, da ich (noch) keine Gelegenheit/Zeit hatte, sie auf dem realen Server zu testen.

Hier geht es zum Node-js-Code. Ich habe diesen Code in eine Datei namens nodeserver.js geschrieben:

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

Und hier ist der einfache Code in PHP, der den node-js-Server mit Hilfe von file_get_contents () aufruft:

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

Funktioniert super, wenn ich die PHP-Seite lade, ruft sie wiederum die node-server.js-Seite auf, die das knall-Objekt jsonifiziert.

Ich habe zwei localhost-Installationen auf iis unter Windows 10, einen Standard-PHP-Server, und der nodejs-Server arbeitet mit dem neat iisnode -Paket.

Der 'echte' Server läuft auf Ubuntu.

Ich denke, dies ist eine saubere und einfache Lösung für die Kommunikation zwischen zwei Servern, aber vielleicht hat jemand Kommentare dazu?

2
Snorvarg

Versuchen Sie es ähnlich oder überprüfen Sie meinen Blog auf vollständigen Beispielcode auf nodejs


Auf Ihrer Seite:

  • Laden Sie den Sockel JS

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

  • Objekt aus der Steckdose machen

var socket = io ();

  • Verwenden Sie die Funktion emit, um Daten an den Knotenserver zu senden.

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

Nun wird Ihr Code so aussehen

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

  });
});

Jetzt auf Node serverseitig einen Handler für Ihre Anfrage erstellen, um Ihre Anfrage zu erhalten und eine Nachricht an alle angeschlossenen Geräte/Browser zu senden (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');
});

Nun kann der Client/Browser/Client-Seite einen Empfänger zum Empfangen einer Socket-Nachricht vom Knotenserver einrichten

<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
vikujangid