2011-01-01 11 views
17

मैं लंबे समय से आयोजित HTTP अनुरोध (धूमकेतु), AJAX और websockets (उपयोग किए गए ब्राउज़र के आधार पर) का उपयोग कर एक HTTP वेबकैट प्रोग्राम करना चाहता हूं। Userdatabase mysql में है। चैट पीएचपी में लिखा गया है, सिवाय इसके कि चैट स्ट्रीम स्वयं भी जावास्क्रिप्ट (node.js) में लिखा जा सकता है:PHP सॉकेट सर्वर बनाम node.js: वेब चैट

मैं प्रति उपयोगकर्ता एक PHP प्रक्रिया शुरू नहीं करना चाहता क्योंकि चैट भेजने का कोई अच्छा तरीका नहीं है इन php बच्चों के बीच संदेश। तो मैंने PHP या node.js में अपना सॉकेट सर्वर लिखने के बारे में सोचा जो कि 1000 से अधिक कनेक्शन (चैट उपयोगकर्ताओं) को संभालने में सक्षम होना चाहिए। पूरी तरह से वेब डेवलपर (PHP) के रूप में मैं सॉकेट से ज्यादा परिचित नहीं हूं क्योंकि मैं आमतौर पर कनेक्शन के बारे में वेब सर्वर की देखभाल करता हूं। चैट संदेश डिस्क पर और न ही mysql में सहेजे जाएंगे, लेकिन रैम में एक सरणी या ऑब्जेक्ट के रूप में सर्वश्रेष्ठ गति के लिए।

जहां तक ​​मुझे पता है कि एक ही PHP प्रक्रिया (सॉकेट सर्वर) में एक ही समय में एकाधिक कनेक्शन को संभालने का कोई तरीका नहीं है, हालांकि आप बड़ी संख्या में सॉकेट कनेक्शन स्वीकार कर सकते हैं और उन्हें लूप में लगातार संसाधित कर सकते हैं (पढ़ना और लिखें; आने वाला संदेश -> सभी सॉकेट कनेक्शन को लिखें)। समस्या यह है कि ~ 1000 उपयोगकर्ताओं के साथ अंतराल होने की संभावना है और MySQL ऑपरेशन पूरी चीज को धीमा कर सकता है जो तब सभी उपयोगकर्ताओं को प्रभावित करेगा।

मेरा प्रश्न है: क्या node.js बेहतर प्रदर्शन के साथ सॉकेट सर्वर को संभाल सकता है? Node.js घटना-आधारित है लेकिन मुझे यकीन नहीं है कि यह एक ही समय में कई घटनाओं को संसाधित कर सकता है (क्या उसे बहु-थ्रेडिंग की आवश्यकता नहीं होगी?) या यदि कोई ईवेंट कतार है। एक घटना कतार के साथ यह php की तरह होगा: उपयोगकर्ता के बाद प्रक्रिया उपयोगकर्ता।

मैं प्रति चैट रूम (बहुत कम उपयोगकर्ताओं) के लिए एक पीएचपी प्रक्रिया भी उत्पन्न कर सकता हूं लेकिन afaik सिंगलथ्रेड किए गए आईआरसी सर्वर हैं जो हजारों उपयोगकर्ताओं को संभालने में भी सक्षम हैं। (सी ++ या जो कुछ भी लिखा है) तो शायद यह php में भी संभव है।

मैं PHP को नोड.जेएस पर पसंद करूंगा क्योंकि तब परियोजना केवल PHP होगी और प्रोग्रामिंग भाषाओं का मिश्रण नहीं होगा। हालांकि अगर नोड एक साथ कनेक्शन संसाधित कर सकता है तो शायद मैं इसे चुनूंगा।

उत्तर

24

जावास्क्रिप्ट, या इस मामले में वी 8 जो इंजन नोड का उपयोग कर रहा है, डिज़ाइन एकल थ्रेडेड है। तो हाँ बस एक घटना कतार है।

लेकिन अंत में, यह कोई समस्या नहीं है, कुछ हमेशा पहले होने वाला है, जब तक कि आप एकाधिक प्रोसेसर का उपयोग नहीं कर रहे हों, और फिर भी, आपके पास केवल एक नेटवर्क कार्ड होगा ... एक राउटर .. । तुम्हें नया तरीका मिल गया है। इसके अलावा, 1000+ धागे का उपयोग ... अच्छा विचार नहीं, बुरी तरह से स्केल करता है, और आप स्वयं को एक समेकन हेल में पाएंगे।

1000 चैट उपयोगकर्ता, पर Node.js. के लिए कोई समस्या नहीं होगी।

मैं तुम्हें एक सुंदर बुनियादी विचार कैसे आप इसे सेट होता है, इस सादे वेनिला चैट thingy टेलनेट पर काम करता है, यह है .. कोई सुविधाओं को दे सकते हैं, लेकिन यह काम करता है:

var net = require('net'); // require the net module 

var users = []; // keep track of the users 

// setup a new tcp socket server 
net.createServer(function(socket) { // provide a callback in case a new connection gets 
            // established, socket is the socket object 

    // keep track of this users names, via use of closures 
    var name = ''; 

    // ask the new user for a name 
    socket.write('Enter a Name(max 12 chars): '); 

    // register a callback on the socket for the case of incoming data 
    socket.on('data', function(buffer) { // buffer is a Buffer object containing the data 
     if (name !== '') { // in case this user has a name... 

      // send out his message to all the other users... 
      for(var i = 0; i < users.length; i++) { 
       if (users[i] !== socket) { // ...but himself 
        users[i].write(name + ': ' 
            + buffer.toString('ascii').trim() 
            + '\r\n'); 
       } 
      } 

     // otherwise take the data and use that as a name 
     } else { 
      name = buffer.toString('ascii').substring(0, 12).trim().replace(/\s/g, '_'); 
      socket.write('> You have joined as ' + name + '\r\n'); 

      // push this socket to the user list 
      users.push(socket); 
      for(var i = 0; i < users.length; i++) { 
       if (users[i] !== socket) { 
        users[i].write('> ' + name + ' has joined' + '\r\n'); 
       } 
      } 
     } 
    }); 

    // another callback for removing the user aka socket from the list 
    socket.on('end', function() { 
     users.splice(users.indexOf(socket), 1); 
    }); 

// bind the server to port 8000 
}).listen(8000); 

कोई है यहां शामिल जादू (closures के उपयोग के अलावा), आपको कच्चे सॉकेट प्रोग्रामिंग के साथ नहीं करना है और आपके पास कोई समवर्ती समस्या नहीं होगी। और आप कुछ नवीनतम गर्मियों को सीखते हैं;)

मैं अनुशंसा करता हूं कि आप हमारे Node.js टैग विकी पर सूचीबद्ध कुछ वार्ताएं देखें, ताकि Node.js कैसे काम करता है, इस बारे में बेहतर समझ प्राप्त हो सके।

+0

धन्यवाद अपनी आवश्यकताओं के पैमाने पर होगा। मैंने पिछले हफ्ते PHP में बहुत कुछ लिखा था (यहां तक ​​कि नाम! == '' भाग समान है), इसलिए अब मैं जांच करूंगा कि यह PHP में जितना तेज़ है node.js में है इसलिए मुझे बग की आवश्यकता नहीं है दो भाषाएं हालांकि node.js अच्छा और आसान है क्योंकि मैंने इसे क्लाइंट साइड स्क्रिप्टिंग के लिए अब वर्षों से उपयोग किया है (jquery आदि)। – Eliasdx

+1

@Eliasdx क्या आप हर बेंचमार्क node.js बनाम php करते हैं? मैं उत्सुक हूं कि परिणाम क्या हो सकते हैं। – William

+0

@Eliasdx इस पर कोई खबर है? मैं खुद को चैट बनाने और अपने निष्कर्षों के बारे में जानने में बहुत दिलचस्पी ले रहा हूं। मैं व्यक्तिगत रूप से PHP में अधिक हूं। –

संबंधित मुद्दे