কীভাবে নোডজেএস + সকেট.আইও এবং পিএইচপি সংহত করবেন?


98

নোডজেএস এবং পিএইচপি-র মধ্যে যোগাযোগের জন্য একটি ভাল উপায় খুঁজতে আমি সম্প্রতি ঘুরে দেখছিলাম। এই ধারণাটি এখানে: নোডজেএস এখনও সম্পূর্ণ নতুন, এবং এটির সাথে কেবল একটি সম্পূর্ণ অ্যাপ্লিকেশন বিকাশ করা এক ধরণের কৌশলী হতে পারে। তদুপরি, আপনার প্রয়োজন হতে পারে আপনার প্রকল্পের একমাত্র মডিউল যেমন রিয়েলটাইম বিজ্ঞপ্তি, চ্যাট, ... এবং আপনি পিএইচপি দিয়ে অন্য সমস্ত জিনিস পরিচালনা করতে চান কারণ এটি সম্ভবত আপনার পক্ষে আরও সহজ (এবং আপনি সুবিধা নিতে পারেন বিদ্যমান কাঠামো, যেমন কোডআইগনিটার বা সিমফনি)

আমি একটি সহজ সমাধান করতে চাই; অ্যাপাচি এবং নোড সার্ভারের মধ্যে যোগাযোগের জন্য আমি সিআরএল বা তৃতীয় সার্ভারটি ব্যবহার করতে চাই না। আমি যা চাই তা হল সহজ জাভাস্ক্রিপ্ট, ক্লায়েন্ট-সাইডে নোড থেকে ইভেন্টগুলি ধরতে সক্ষম হওয়া।

আমি কোনও উত্তর পাইনি যে যেখানে সম্পূর্ণ হয়, বেশিরভাগ সময় ক্লায়েন্ট-সাইডটি নোড সার্ভার দ্বারা চলছিল এবং তাই এটি আমার ক্ষেত্রে প্রযোজ্য নয়। সুতরাং আমি সম্ভাব্য সমস্ত বিষয় ক্রল করেছি এবং অবশেষে আমার উত্তরটি সন্ধান করেছি; আমি এটিকে ভাগ করে নেওয়ার চেষ্টা করব এবং এমন একটি বিষয় রয়েছে যেখানে এটি সমস্ত পরিষ্কার।

আশা করি এটি কিছু লোককে সহায়তা করতে পারে! ;)

উত্তর:


131

সুতরাং, শুরুতে, আমি আমার প্রকল্পটি গিথুবটিতে রেখেছি, যদি আপনি সম্পূর্ণ কোডটিতে অ্যাক্সেস চান: https://github.com/jdutheil/nodePHP

এটি একটি খুব সাধারণ উদাহরণ প্রকল্প: একটি ওয়েব চ্যাট। আপনার কাছে কেবল একজন লেখক এবং বার্তা রয়েছে এবং আপনি যখন প্রেরণ টিপেন তখন এটি একটি মাইএসকিএল ডাটাবেসে সংরক্ষিত হয়। ধারণাটি হ'ল রিয়েল টাইম আপডেটগুলি প্রেরণ করা এবং আসল কথোপকথন করা। ;) আমরা এর জন্য নোডজেএস ব্যবহার করব।

আমি পিএইচপি কোড সম্পর্কে কথা বলব না, এটি সত্যিই সহজ এবং এখানে আকর্ষণীয় নয়; আমি আপনাকে যা দেখতে চাই তা হল আপনার নোডজেএস কোডটি কীভাবে সংহত করা যায়।

আমি এক্সপ্রেস এবং সকেট ব্যবহার করি I তারপরে, আমরা একটি সাধারণ নোডজেএস সার্ভার তৈরি করি:

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

যখন কোনও নতুন ব্যবহারকারী সংযুক্ত থাকে তখন আমরা আমাদের ইভেন্টগুলি কলব্যাকটি নিবন্ধভুক্ত করি; প্রতিবার আমরা কোনও বার্তা পাই (একটি চ্যাট বার্তার প্রতিনিধিত্ব করে), আমরা এটি সংযুক্ত প্রতিটি ব্যবহারকারীর কাছে সম্প্রচার করি। এখন, জটিল অংশ: ক্লায়েন্ট-সাইড! যে অংশটি আমাকে বেশিরভাগ সময় নিয়েছিল, কারণ কোন স্ক্রিপ্টে নোড সার্ভার ছাড়া সকেট.আইও কোড চালাতে সক্ষম হতে হবে তা আমি জানতাম না (কারণ ক্লায়েন্ট পৃষ্ঠাটি অ্যাপাচি পরিবেশন করবে)।

তবে সবকিছু ইতিমধ্যে সম্পন্ন হয়েছে; আপনি যখন এনপিএম সহ সকেট.আইও মডিউল ইনস্টল করেন, তখন একটি স্ক্রিপ্ট পাওয়া যায় /node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js; যে স্ক্রিপ্টটি আমরা আমাদের পিএইচপি পৃষ্ঠায় অন্তর্ভুক্ত করব, আমার ক্ষেত্রে:

    <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
ঠিক আছে, আপনি যখন কোনও প্রশ্ন লেখেন তখন একটি বিকল্প আছে "আপনার নিজের প্রশ্নের উত্তর দিন, জ্ঞান প্রশ্নোত্তর শৈলী ভাগ করুন", তাই আমি ভেবেছিলাম আমরা এর মতো ভাগ করে নিতে পারি, দুঃখিত যদি আমি ভুল করি :)
জারমি দুথিল

4
পরামর্শ হিসাবে, আমি মনে করি যে এখানে এই প্রশ্নের উত্তর একত্রিত করা stackoverflow.com/questions/5818312/mysql-with-node-js একটি উচ্চতর পদ্ধতি। কোনও এজাক্স কল এড়ানো এবং নোড ব্যবহারের সাথে কোডটি আরও ইনলাইন করা। এখন, পিএইচপি সহজভাবে ডাটাবেস থেকে তথ্য নির্বাচন করতে পারেন।
ব্ল্যাকমম্বো

4
একই সার্ভারে নোড অ্যাপ রাখার পরিবর্তে অন্য কোনও পোর্ট ব্যবহার না করে যদি আপনার প্রধান অ্যাপ্লিকেশনটির চেয়ে আলাদা মেশিনে থাকে তবে আইওকোনেক্ট ব্যবহার করে নোড অ্যাপের সাথে সংযোগ স্থাপন করা সম্ভব?
ম্যাম্বে

4
বার্তা প্রমাণীকরণ হিসাবে hmac স্বাক্ষর প্রয়োজন। এটি নিশ্চিত করে যে কেবল পিএইচপি সকেটে বার্তা সম্প্রচার করতে পারে। সকেট স্বাক্ষরিত টোকেনটি পরিদর্শন করবে এবং যদি এটি পাস হয়ে যায় তবে তি বার্তাটি সম্প্রচার করবে। এটি স্প্যাম প্রতিরোধ এবং ডেটা অখণ্ডতা নিশ্চিত করার জন্য ভাল। সুতরাং কখনই ক্লায়েন্টের কাছ থেকে সরাসরি নোড সকেটে পোস্ট করবেন না। পরিবর্তে আজ্যাক্সের সাথে পিএইচপি অ্যাপ্লিকেশন পোস্ট করুন, তারপরে এটি সকেট সার্ভারে রিলে করুন। ফোপেন + ফ্রিটাইট বা পিএইচপি থেকে স্ট্রিম নির্বাচন করে একটি ওয়েবসকেট সার্ভারে সকেট সংযোগ খোলানো মোটামুটি তুচ্ছ নয়।
r3wt

4
@ বঙ্গশ এর সাথে সম্মত, আপনি পিএইচপি পরিবর্তে মাইএসকিএল ডিবিতে ডেটা সঞ্চয় করতে নোড.জেএস ব্যবহার করতে পারেন, এটি এটিকে অনেক দ্রুত করে তুলবে
পার্থপ্রতিম নিওগ

2

আমার কাছে আরও একটি সমাধান রয়েছে যা আমার পক্ষে বেশ ভালভাবে কাজ করে তবে আমি এটির কতটা কার্যকর তা সম্পর্কে কেউ মন্তব্য করতে চাই, কারণ সত্যিকারের সার্ভারে এটি পরীক্ষার (এখনও) সুযোগ / সময় পাইনি।

এখানে নোড-জেএস কোড যায়। আমি এই কোডটি নোডেসের.এসএস নামে একটি ফাইলে রেখেছি:

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

এবং পিএইচপি-তে কোডের সহজ টুকরোটি রয়েছে, নোড-জেএস সার্ভারকে ফাইল_জেট_কন্টেন্টস () এর সাহায্যে কল করে:

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

দুর্দান্ত কাজ করে, যখন আমি পিএইচপি-পৃষ্ঠাটি লোড করি তখন এটি নোডেসেরও.জেএস পৃষ্ঠাটি কল করে, যা নল-অবজেক্টকে জসনাইফাই করে।

আমি উইন্ডোজ 10, একটি স্ট্যান্ডার্ড পিএইচপি-সার্ভার, এবং নোডেজ-সার্ভার ঝরঝরে আইসনোড প্যাকেজটির সাথে কাজ করে যাচ্ছি, আমি দুটি লোকালহোস্ট-ইনস্টলেশন স্থাপন করেছি have

'রিয়েল' সার্ভারটি উবুন্টুতে চালিত।

আমি মনে করি এটি দুটি সার্ভারের মধ্যে যোগাযোগের জন্য একটি পরিষ্কার এবং সহজ সমাধান, তবে এটি সম্পর্কে কারও কোনও মন্তব্য থাকতে পারে?


এটি আমার কাছে কোনও অর্থবোধ করে না, কারণ আপনি পিএইচপি স্ক্রিপ্টের মধ্যে থেকে নোড সার্ভারটি চালু করছেন। আমি এর জন্য কোনও ব্যবহারের ক্ষেত্রে কল্পনা করতে পারি না। আমাদের যা প্রয়োজন তা হল একটি চলমান নোড.জেএস উদাহরণ এবং পিএইচপি এর মধ্যে যোগাযোগের একটি উপায়।
লরেঞ্জ মেয়ার

@ লরেঞ্জ নয়, এটি নোড.জেএস স্ক্রিপ্ট, এটি নিজস্ব সার্ভারে চলছে। আমি পিএইচপি থেকে file_get_contents () এর সাথে অন্য পিএইচপি-সার্ভার থেকে সরাসরি নোড.জেএস পৃষ্ঠাটি কল করছি। এটি প্রতিদিন 500+ ব্যবহারকারীর সাথে প্রতিদিনের ব্যবহারে রয়েছে। "লোকালহস্ট: 3002" টুকরা বলে আপনি হয়ত বিভ্রান্ত হয়ে পড়েছেন? কারণ এই উদাহরণটি আমার স্থানীয় উইন্ডো-কম্পিউটারে চালিত হয়, আইআইএসে দুটি স্বতন্ত্র সার্ভার সহ।
স্নোরভার্গ

আমি সত্যি বিভ্রান্ত. এর অর্থ এই যে nodejs.jsআসলে না একটি সোর্স ফাইল, কিন্তু এটা একটি URL আপনি এখন নামকরণ করা হয়, কারণ এটি JSON রয়েছে? প্রথমটি কোনও অর্থবোধ করে না, তবে পরবর্তীটি আমার কাছে খুব বিভ্রান্ত বলে মনে হচ্ছে।
লরেঞ্জ মেয়ার

@ লরেঞ্জ, আমি নোডেজ জেএস ফাইলের ফাইলের নাম পরিবর্তন করে এবং পাঠ্যকে কিছুটা সম্পাদনা করে উদাহরণটি পরিষ্কার করার চেষ্টা করেছি। আপনার প্রশ্নের উত্তর দেওয়ার জন্য, ফাইলটি এখন nodeserver.js নামকরণ করে এটি নিজস্ব সার্ভারে চালিত হয়। Http.createServer () কলটি একটি সার্ভার তৈরি করে, যা 80 (পোর্ট) 80 এ আগত সংযোগগুলির জন্য
শুনবে

মনে রাখবেন যে আপনি ব্রাউজার থেকে সরাসরি নোড.জেএস সার্ভারকে কল করতে পারেন, কেবলমাত্র " লোকালহোস্ট: 3002 / নোডেরভার.js " url লিখে আপনি জসন -প্রতিক্রিয়া পাবেন। পিএইচপি ফাইলে ফাইল_জেট_কন্টেন্টস () অন্য সার্ভার থেকে এই বিষয়বস্তু নিয়ে আসে, এই ক্ষেত্রে নোড.জেএস সার্ভার।
স্নোরভার্গ

0

অনুরূপ চেষ্টা করুন বা আপনি নোডজে সম্পূর্ণ নমুনা কোডের জন্য আমার ব্লগটি পরীক্ষা করতে পারেন


আপনার পৃষ্ঠায়:

  • লোড সকেট জেএস

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

  • সকেটের অবজেক্ট তৈরি করুন

var সকেট = io ();

  • emitনোডসারভারে ডেটা প্রেরণে ফাংশনটি ব্যবহার করুন ।

socket.emit ('new_notifications', {
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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.