नोडजेएस + सॉकेट.आईओ और पीएचपी को कैसे एकीकृत करें?


98

मैं हाल ही में चारों ओर देख रहा हूं, नोडजेएस और पीएचपी के बीच संवाद करने का एक अच्छा तरीका खोजने के लिए। यह विचार है: नोडजेएस अभी भी काफी नया है, और यह केवल इसके साथ एक पूर्ण एप्लिकेशन विकसित करने के लिए एक तरह से मुश्किल हो सकता है। इसके अलावा, आपको अपनी परियोजना के केवल एक मॉड्यूल के लिए इसकी आवश्यकता हो सकती है, जैसे रीयलटाइम सूचनाएं, चैट, ... और आप PHP के साथ अन्य सभी सामान का प्रबंधन करना चाहते हैं, क्योंकि यह संभवतः आपके लिए अधिक आसान है (और आप इसका लाभ उठा सकते हैं मौजूदा रूपरेखाएँ, जैसे CodeIgniter या सिम्फनी)।

मैं एक आसान उपाय करना चाहूंगा; मैं Apache और Node सर्वर के बीच संवाद करने के लिए cURL, या किसी तीसरे सर्वर का उपयोग नहीं करना चाहता। मैं जो चाहता हूं वह सरल जावास्क्रिप्ट, क्लाइंट-साइड में नोड से घटनाओं को पकड़ने में सक्षम होना है।

मुझे ऐसा कोई उत्तर नहीं मिला, जहां पूरा हो, ज्यादातर क्लाइंट-साइड नोड सर्वर द्वारा चल रहा था और इसलिए मेरे मामले में लागू नहीं है। इसलिए मैंने सभी संभावित विषयों को क्रॉल किया, और अंत में अपना उत्तर ढूंढा; मैं इसे साझा करने का प्रयास करूंगा, और एक बिंदु होगा जहां यह सब स्पष्ट है।

आशा है कि यह कुछ लोगों की मदद कर सकता है! ;)

जवाबों:


131

तो, के साथ शुरू करने के लिए, मैंने अपना प्रोजेक्ट जीथब पर रखा, यदि आप पूर्ण कोड तक पहुंच चाहते हैं: https://github.com/jdutheil/nodePHP

यह एक बहुत ही सरल उदाहरण परियोजना है: एक वेब चैट। आपके पास बस एक लेखक और संदेश है, और जब आप इसे भेजते हैं तो इसे mysql डेटाबेस में सहेजा जाता है। विचार वास्तविक समय अद्यतन भेजने के लिए है, और एक वास्तविक वार्तालाप है। ;) हम उसके लिए नोडजेएस का उपयोग करेंगे।

मैं PHP कोड के बारे में बात नहीं करूंगा, यह वास्तव में सरल है और यहां दिलचस्प नहीं है; मैं आपको दिखाना चाहता हूं कि अपने नोडज कोड को कैसे एकीकृत किया जाए।

मैं एक्सप्रेस और सॉकेट.आईओ का उपयोग करता हूं, इसलिए उन मॉड्यूल को एनपीएम के साथ स्थापित करना सुनिश्चित करें। फिर, हम एक सरल नोडजेज सर्वर बनाते हैं:

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

जब कोई नया उपयोगकर्ता जुड़ा होता है तो हमने अपने ईवेंट कॉलबैक को पंजीकृत किया; जब भी हमें कोई संदेश प्राप्त होता है (चैट संदेश का प्रतिनिधित्व करता है), हम इसे जुड़े हुए प्रत्येक उपयोगकर्ताओं के लिए प्रसारित करते हैं। अब, मुश्किल हिस्सा: ग्राहक-पक्ष! वह हिस्सा जो मुझे सबसे अधिक समय लगा, क्योंकि मुझे नहीं पता था कि किस स्क्रिप्ट में नोडसर्वर के बिना सॉकेट को चलाने में सक्षम होना शामिल है (क्योंकि क्लाइंट पेज एपाचे द्वारा परोसा जाएगा)।

लेकिन सब कुछ पहले से ही किया जाता है; जब आप Npm के साथ सॉकेट.आईओ मॉड्यूल स्थापित करते हैं, तो एक स्क्रिप्ट उपलब्ध होती है /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js; वह स्क्रिप्ट जो हम अपने मामले में अपने PHP पेज में शामिल करेंगे:

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

और समाप्त करने के लिए, मेरे नोडक्लाइंट.जेएस, जहां हम केवल नोड सर्वर से कनेक्ट करते हैं और हमारे पेज को अपडेट करने के लिए घटना की प्रतीक्षा करते हैं। ;)

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

मैं जितनी जल्दी हो सके अपने कोड को अपडेट और सुधारने की कोशिश करूंगा, लेकिन मुझे लगता है कि यह पहले से ही सभी शांत चीजों के लिए खुला है! मैं इस सामान पर सलाह और समीक्षा के लिए वास्तव में खुला हूं, क्या यह इसे करने का अच्छा तरीका है, ..?

आशा है कि यह कुछ लोगों की मदद कर सकता है!


18
ठीक है, जब आप एक प्रश्न लिखते हैं तो एक विकल्प होता है "अपने स्वयं के प्रश्न का उत्तर दें, ज्ञान Q & A शैली साझा करें", इसलिए मैंने सोचा कि हम इस तरह साझा कर सकते हैं, क्षमा करें यदि मैं गलत हूं :)
Jérémy Dutheil

4
सुझाव के रूप में, मुझे लगता है कि इस प्रश्न के उत्तर को यहां शामिल करना stackoverflow.com/questions/5818312/mysql-with-node-js एक बेहतर विधि है। किसी भी अजाक्स कॉल से बचने और नोड के उपयोग के साथ कोड को अधिक इनलाइन बनाना। अब, PHP केवल डेटाबेस से जानकारी का चयन कर सकती है।
ब्लैकमोम्बो

1
क्या io.connect का उपयोग करके नोड ऐप से कनेक्ट करना संभव है यदि यह एक ही सर्वर पर नोड ऐप होने के बजाय एक अलग मशीन पर एक अलग पोर्ट का उपयोग करके है?
मेम्बे

1
संदेश प्रमाणीकरण के रूप में hmac हस्ताक्षर करने की आवश्यकता है। यह सुनिश्चित करता है कि केवल php सॉकेट को संदेश प्रसारित कर सकता है। सॉकेट हस्ताक्षरित टोकन का निरीक्षण करेगा, और यदि यह गुजरता है, तो ti संदेश प्रसारित करेगा। यह स्पैम को रोकने और डेटा अखंडता सुनिश्चित करने के लिए अच्छा है। इसलिए क्लाइंट से सीधे नोड सॉकेट पर पोस्ट न करें। इसके बजाय ajax के साथ php ऐप पर पोस्ट करें, फिर उस सॉकेट सर्वर पर रिले करें। यह वेब-सर्वर से सॉकेट कनेक्शन को खोलने के लिए काफी गैर तुच्छ है, जिसमें fopen + fwrite या php सेलेक्ट स्ट्रीम है।
r3wt

1
@Bangash से सहमत, आप PHP के बजाय mysql db में डेटा को स्टोर करने के लिए Node.js का उपयोग कर सकते हैं, जिससे यह बहुत तेज़ हो जाएगा
पार्थप्रेटीम Neog

2

मेरे पास एक और समाधान है जो मेरे लिए काफी अच्छा काम करता है, लेकिन मैं चाहूंगा कि कोई व्यक्ति इस बारे में टिप्पणी करे कि यह कितना प्रभावी है, क्योंकि मेरे पास वास्तविक सर्वर पर इसका परीक्षण करने का अवसर (अभी तक) नहीं है।

यहां नोड-जेएस कोड जाता है। मैंने इस कोड को 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);  

और यहाँ php में कोड का सरल टुकड़ा है, file_get_contents () की मदद से नोड-जेएस सर्वर को कॉल करना:

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

महान काम करता है, जब मैं php- पेज को लोड करता हूं, तो यह बदले में nodeserver.js पेज को कॉल करता है, जो कि नॉले-ऑब्जेक्ट को jsonify करता है।

मेरे पास विंडोज़ 10 पर iis पर चलने वाले दो लोकलहोस्ट-इंस्टॉलेशन हैं, एक मानक php-server, और नोडज-सर्वर नीट आईसिनोड पैकेज के साथ काम करता है ।

The real ’सर्वर को ubuntu पर चलाया जाता है।

मुझे लगता है कि यह दो सर्वरों के बीच संचार के लिए एक साफ और आसान समाधान है, लेकिन शायद किसी के पास इसके बारे में कोई टिप्पणी है?


इससे मुझे कोई मतलब नहीं है, क्योंकि आप php स्क्रिप्ट के भीतर से नोड सर्वर लॉन्च कर रहे हैं। मैं इसके लिए किसी भी मामले का उपयोग नहीं कर सकता। हमें जो कुछ भी चाहिए वह एक चल रहे नोड के बीच संवाद करने का एक तरीका है। उदाहरण और php।
लोरेंज मेयर

कोई @Lorenz, वह नोड.जेएस स्क्रिप्ट नहीं है, यह स्वयं का सर्वर है। मैं एक और php- सर्वर से file_get_contents () के साथ php से नोड.जेएस-पेज को सीधे कॉल कर रहा हूं। यह अब प्रतिदिन 500+ उपयोगकर्ताओं के साथ रोजमर्रा के उपयोग में है। शायद आप भ्रमित हैं क्योंकि "लोकलहोस्ट: 3002" टुकड़ा? ऐसा इसलिए है क्योंकि यह उदाहरण मेरे स्थानीय विंडो-कंप्यूटर पर चलता है, जिसमें आईस में दो स्टैंडअलोन सर्वर हैं।
स्नोवरग

मैं वास्तव में उलझन में हूँ। इसका मतलब है कि nodejs.jsवास्तव में एक स्रोत फ़ाइल नहीं है, लेकिन यह एक URL है जिसे आपने नाम दिया है, क्योंकि इसमें json शामिल है? पहला कोई मतलब नहीं होगा, लेकिन उत्तरार्द्ध मुझे बहुत भ्रमित लगता है।
लॉरेंज मेयर

@ लॉरेंज, मैंने नोडज जेएस फ़ाइल का फ़ाइल नाम बदलकर और पाठ को थोड़ा संपादित करके उदाहरण को स्पष्ट करने की कोशिश की। आपके प्रश्न का उत्तर देने के लिए, अब नाम बदलकर nodeserver.js का नाम दिया गया है, यह स्वयं का सर्वर है। Http.createServer () कॉल एक सर्वर बनाता है, जो सुनता है () पोर्ट 80 पर आने वाले कनेक्शन के लिए है।
स्नोरवरग

ध्यान दें कि आप एक ब्राउज़र से सीधे नोड.जेएस सर्वर को कॉल कर सकते हैं, बस url " लोकलहोस्ट: 3002 / nodeserver.js " दर्ज करें, और आपको एक json-response मिलेगा। Php फ़ाइल में file_get_contents () दूसरे सर्वर से सामग्री प्राप्त करता है, इस स्थिति में नोड.जेएस सर्वर।
स्नोवरग

0

समान प्रयास करें या आप नोडज पर पूर्ण नमूना कोड के लिए मेरे ब्लॉग की जांच कर सकते हैं


आपके पृष्ठ की ओर:

  • लोड सॉकेट जेएस

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

  • सॉकेट की वस्तु बनाओ

var सॉकेट = io ();

  • emitनोड्सर्वर को डेटा भेजने के लिए फ़ंक्शन का उपयोग करें ।

सॉकेट.मिट ('new_notification', {
message: 'message',
शीर्षक: 'शीर्षक',
आइकन: 'आइकन',
});

तो अब आपका कोड दिखेगा

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

  });
});

अब नोड सर्वर की ओर से आपके अनुरोध को प्राप्त करने के लिए हैंडलर बनाएं और सभी जुड़े उपकरणों / ब्राउज़रों (सर्वर.जेएस) को एक संदेश भेजें

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

अब क्लाइंट / ब्राउज़र / क्लाइंट साइड नोड सर्वर से सॉकेट संदेश प्राप्त करने के लिए एक रिसीवर बनाते हैं

<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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.