2010-09-02 6 views
8

मैं एक साधारण चैट ऐप पर काम कर रहा हूं, शायद प्रति कमरा 10 से 20 उपयोगकर्ता।सरल PHP लंबी मतदान चैट स्क्रिप्ट, बहुत आसान है?

स्क्रिप्ट जो नए संदेशों के लिए डेटाबेस से पूछताछ करता है वह सभी अनुरोधों के लिए बहुत आसान लग रहा है।

$sleepTime = 1; //Seconds 
$data = ""; 
$timeout = 0; 

//Query database for data 
while(!$data and $timeout < 10){ 
    $data = getQuery($sql); 
    if(!$data){ 
     //No new messages on the chat 
     flush(); 
     //Wait for new Messages 
     sleep($sleepTime);   
     $timeout += 1; 
    }else{ 
     break; 
    } 
} 

ब्लॉक ऊपर क्वेरी करेगा:

नीचे कोड के ब्लॉक कि नए संदेशों के लिए लूप होता है, स्क्रिप्ट के बाकी बस चर हो रही है, क्वेरी के निर्माण और json प्रतिक्रिया ऑब्जेक्ट है 10 सेकेंड के लिए हर सेकेंड के नए संदेशों के लिए डेटाबेस, अगर 10 सेकंड के बाद कोई नया संदेश नहीं है तो यह ब्राउज़र को सूचित करेगा। ब्राउज़र 5 सेकंड प्रतीक्षा करता है और फिर नए संदेश प्राप्त करने के लिए पर एक और अनुरोध भेजता है।

हालांकि यदि स्क्रिप्ट को नए संदेश मिलते हैं, तो ब्राउज़र सर्वर से नए संदेशों के साथ प्रतिक्रिया प्राप्त होने पर तुरंत नए संदेशों का अनुरोध करेगा।

इस प्रक्रिया पर और पर चला जाता है ...

तो मैं कैसे इस प्रक्रिया को किसी भी आगे अनुकूलन कर सकते हैं? क्या यह उतना अच्छा है जितना इसे मिलता है? मेरे स्थानीय सर्वर पर ठीक काम कर रहा है, लेकिन मुझे डर है कि केवल कुछ उपयोगकर्ता सभी अनुरोधों और लूपिंग के साथ एक लाइव सर्वर (साझा होस्ट) को अधिभारित कर सकते हैं।

यहाँ आप फ़ायरबग http://pixbush.com/chat/chat.php

+3

सरलता हम प्रोग्रामर के रूप में ** ** ** के लिए प्रयास करते हैं। –

+4

लिंक अब और काम नहीं कर रहा है। – kachar

उत्तर

2

यह AJAX के लिए चिल्लाती से सलाह ले सकते लाइव डेमो है।

मेरी पोस्ट आज how to send JavaScript responses to PHP पर देखें। ऐसा कोई कारण नहीं है कि आपकी स्क्रिप्ट को लूप क्यों होना चाहिए।


संपादित करें: AJAX के बारे में मेरा बुरा। जब मैंने आईआरसी चैटबॉट PHP-Egg लिखा, तो मैंने इस समस्या * 100 में भाग लिया। जिस तरह से मैंने इसे हल किया (पीएचपी 4 दिनों में, आपको दिमाग में) pcntl_fork() PHP था और जब भी कोई संदेश होता था तो यह बस वापस आ जाता था। लाभ यह है कि यह 100% सीपीयू को अवरुद्ध नहीं करता है, नींद() के विपरीत और 10 सेकंड से अधिक तेज़ या किसी भी मनमानी सीमा को आप उस पर डालते हैं।


मैं अपने जवाब फिर से संशोधन कर रहा हूँ (खेद है!):

उपयोग अतुल्यकालिक प्रक्रिया में किसी प्रकार का है कि एक फ़ाइल में पाठ उदासीनता।

तो फिर तुम करना चाहते हैं क्या

अगर है (filemtime ('chat.log')> समय() - 5) { गूंज json_encode (file_get_contents ('chat.log')); }

लाभ: सीमित SQL उपयोग; लूप की जरूरत नहीं है।

+3

मुझे यकीन है कि OP * है * AJAX का उपयोग ** लंबे समय तक मतदान ** के साथ, जैसा कि सवाल बताता है। http://en.wikipedia.org/wiki/Comet_(programming)#Ajax_with_long_polling – deceze

+0

@ पाब्लो: कुछ ट्यूटोरियल जो आपकी मदद कर सकते हैं: http://css-tricks.com/chat2/, http: // net। tutsplus.com/tutorials/javascript-ajax/how-to-create-a-simple-web-based-chat-application/, http://anantgarg.com/2009/05/13/gmail-facebook-style-jquery -चैट /। AJAX निश्चित रूप से जाने का रास्ता है। –

+1

AJAX अनुरोधों को कम करने के लिए सर्वर में AJAX, प्लस आईएम लूपिंग का उपयोग कर रहा हूं। – Pablo

0

आप बातचीत के अनुसार लेबल की गई फ़ाइलों का उपयोग करने की कोशिश कर सकते हैं आईडीबी के बजाय आईडी और बस जांचें कि फ़ाइल 'छुआ' है या नहीं। इसके अलावा, मिलिसेक्स में अपना अंतराल सेट करने और नींद के समय को बढ़ाने के लिए, नींद और set_time_limit (विंडोज सर्वर के लिए) का उपयोग करें। वास्तव में सो जाओ, सीपीयू उपयोग में देरी है लेकिन अभी भी आग लग रही है फाइल को बदल दिया गया है।

यहां मेरी चैट स्क्रिप्ट का एक अनुभाग है। =)

define('SUCCESS', '__SUCCESS__'); 
define('FAILED', '__FAILED__'); 

$tmpLib = $TMPFOLDER; 
$msgPath = $MSGFILE; 

$timeout = $POLLSPEEDSEC; 

$acct = new Account($tmpLib, $_GET['key']); 

if (false === $acct) { 
    return false; 
} 

$msg = new Message($msgPath, $acct); 

$lastMod = !empty($_GET['ts']) ? $_GET['ts']: 0; 
$lastMod = substr($lastMod, 0, 10); 
$lastMod = (int)$lastMod; 

$result = array(); 

$start = gettimeofday(); 
$prevMsg = $acct->getTemp('cache'); 

do{ 
    usleep(10000); 

    if ($acct->getFileTime() >= $lastMod) { 
     $result['account'] = $acct->getAllOnline(); 
    } 

    if($msg->getFileTime() >= $lastMod) { 
     $result['message'] = $msg->fetch(); 
    } 

    if (!empty($result)) { 
     $theMsg = json_encode($result); 
     if ($theMsg != $prevMsg) { 
      $acct->setTemp('cache', $theMsg); 
      echo $theMsg; 
      flush(); 
      exit; 
     } 
     $result = array(); 
     $lastMod = time(); 
    } 

    $end = gettimeofday(); 
} while($timeout > ($end['sec'] - $start['sec'])); 

echo FAILED; 
+0

मेरे उत्तर के समान, इसलिए मैं सहमत हूं। –

+0

और आप वास्तव में कैसे सुनिश्चित करते हैं कि फ़ाइल एक साथ पहुंचने से दूषित नहीं हो पाती है और संभवतः एक ही समय में लिखी गई है? – Pablo

+0

एक साथ पहुंच के लिए, एफएस फ़ाइलों को लॉक करता है इसे दूषित नहीं करता है। यदि ऐसा होता है, तो कोई परिवर्तन नहीं किया जाएगा। 50 संभावनाओं में से 1 शायद यह हो सकता है कि ऐसा होगा। यह एक शो-स्टॉपर बनाने के लिए बहुत कम मौका है। इसके अलावा, यदि आप डीबी का उपयोग करते हैं तो भी एक ही समस्या होती है। सिद्धांत सिद्धांत में बेहतर हैं, क्योंकि यह लॉक को "रिलीज़" करता है और डीबी की तुलना में तेज़ी से प्रतिक्रिया देता है। – sheeks06

3

अपने विवरण है, उससे लगता है जैसे आप जो लंबे समय से मतदान के लाभ धरा मौन के 5 सेकंड के अंतर की है। सर्वर से एक कॉल रिटर्न (लंबा या छोटा) जब ब्राउज़र तुरंत एक और अनुरोध शुरू करें। बैक अप के रूप में, प्रत्येक सर्वर कॉल के साथ, ब्राउज़र सर्वर-साइड टाइमआउट से थोड़ी देर के लिए टाइमआउट शुरू करता है, लेकिन अनुरोध लौटाए जाने पर इसे रद्द कर दें। यदि सर्वर अनुरोध कभी विफल रहता है और ब्राउज़र टाइमआउट पूर्ण हो जाता है, तो एक नया अनुरोध शुरू करें।

1

मैं वेब-चैट कर रहा हूं और रीयल-टाइम अपडेट रखने के लिए एक ही समाधान में आया हूं। तो, मुझे आश्चर्य है कि आपने इसे समझ लिया है: क्या यह नींद() फ़ंक्शन का उपयोग करके लूपिंग सर्वर-साइड रखने का एक अच्छा तरीका है, या शायद इसके बजाय अधिक AJAX क्वेरी का उपयोग करना बेहतर है। और नींद() वास्तव में एक अच्छा विचार है और जब कई उपयोग मतदान कर रहे हैं तो यह सर्वर को रोक नहीं पाएगा?

मैं एसओ चैट ऐप के दौरान लंबे मतदान के दौरान मीबो देखता हूं (पूछताछ के बीच का समय भी विंडो फोकस पर निर्भर करता है)। ऐसा लगता है कि सिर्फ अजाक्स प्रश्नों का उपयोग किया जा रहा है। तो यह मुझे आश्चर्यचकित करता है।

+1

नींद() फ़ंक्शन का उपयोग करके लंबे मतदान में पेपर पर अच्छा लगता है और स्थानीय परीक्षण मशीन पर चलते समय भी बेहतर होता है। लेकिन लाइव सर्वर (साझा होस्टिंग) पर इतना अधिक नहीं है, यह सर्वर पर बहुत अधिक तनाव डालता है। आखिर में मैंने केवल अजाक्स अनुरोधों को रखने का फैसला किया, कोई लंबा मतदान नहीं हुआ। मैंने गतिविधि और स्थिति के स्तर के आधार पर AJAX अनुरोध दर को बढ़ाने और घटाने के लिए कुछ तर्क भी बनाए। – Pablo

+0

उत्तर के लिए धन्यवाद, मैं देखता हूं कि मेरा दीर्घकालिक कैसे जाता है और फिर तय करता है कि इसे छोड़ना है या मना कर देना है या नहीं – dr3w