2013-04-01 17 views
12

मैं एक संदेश प्रणाली के लिए jQuery और PHP के साथ कुछ लंबे मतदान कर रहा हूं। मैं इसे प्राप्त करने के लिए सबसे अच्छा/सबसे प्रभावी तरीका जानना उत्सुक हूं। मैं आधार Simple Long Polling Example बंद कर रहा हूँ।लंबे मतदान - संदेश प्रणाली

यदि कोई उपयोगकर्ता इनबॉक्स पृष्ठ पर बैठा है, तो मैं किसी भी नए संदेश को खींचना चाहता हूं। एक विचार जो मैंने देखा है, संदेश तालिका में last_checked कॉलम जोड़ रहा है। PHP स्क्रिप्ट इस तरह कुछ दिखाई देगी:

query to check for all null `last_checked` messages 
if there are any... 
while(...) { 
    add data to array 
    update `last_checked` column to current time 
} 
send data back 

मुझे यह विचार पसंद है लेकिन मुझे आश्चर्य है कि दूसरे इसके बारे में क्या सोचते हैं। क्या यह इस दृष्टिकोण के लिए एक आदर्श तरीका है? कोई भी जानकारी सहायक होगी!

जोड़ने के लिए, साइट पर होने वाले उपयोगों की कोई निश्चित संख्या नहीं है, इसलिए मैं इसे करने का एक प्रभावी तरीका ढूंढ रहा हूं।

+0

यह एक अच्छा सवाल है, मैं वही बात पूछने वाला था। – samayo

उत्तर

8

हां जिस तरह से आप इसका वर्णन करते हैं वह यह है कि लंबे मतदान विधि आम तौर पर कैसे काम कर रही है। आपका नमूना कोड थोड़ा अस्पष्ट है, इसलिए मैं यह जोड़ना चाहता हूं कि while लूप के अंदर आपको थोड़ी देर के लिए sleep() करना चाहिए और प्रत्येक बार last_checked समय (जो सर्वर पक्ष पर संग्रहीत है) की तुलना करें और current समय (जो ग्राहक के पक्ष से भेजा जाता है)।

कुछ इस तरह:

$current = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
$last_checked = getLastCheckedTime(); //returns the last time db accessed 

while($last_checked <= $current) { 
    usleep(100000); 
    $last_checked = getLastCheckedTime(); 
} 

$response = array(); 
$response['latestData'] = getLatestData() //fetches all the data you want based on time 
$response['timestamp'] = $last_checked; 
echo json_encode($response);  

और अपने ग्राहक की ओर जे एस पर आप इस होगा:

function longPolling(){ 
     $.ajax({ 
      type : 'Get', 
      url : 'data.php?timestamp=' + timestamp, 
      async : true, 
      cache : false, 

      success : function(data) { 
       var jsonData = eval('(' + data + ')'); 
       //do something with the data, eg display them 
       timestamp = jsonData['timestamp']; 
       setTimeout('longPolling()', 1000); 
      }, 
      error : function(XMLHttpRequest, textstatus, error) { 
        alert(error); 
        setTimeout('longPolling()', 15000); 
      }  
     }); 
} 
+0

उत्तर की सराहना करें! फ़ंक्शन 'getLastCheckedTime' में वास्तव में क्या होगा? मुझे पता है कि आपने कहा था कि आखिरी बार डीबी का उपयोग किया जाता है लेकिन मैं कैसे कहूं? डीबी में एक कॉलम? – SeanWM

+0

इसके अलावा, क्या मेरे पास अगर कथन में अंतिम चार पंक्तियां नहीं होनी चाहिए? – SeanWM

+0

हां 'getLastCheckedTime();' को डीबी में एक कॉलम का परिणाम वापस करना होगा जो एक नया संदेश डालने पर स्वचालित रूप से अपडेट हो जाएगा। अंतिम चार पंक्तियों को 'if' कथन में होना जरूरी नहीं है क्योंकि उन्हें केवल तभी निष्पादित किया जाएगा जब डीबी में नया डेटा डाला गया हो और इसलिए केवल' ब्रेक 'तोड़ दिया जाए। –

1

यदि आपके पास केवल एक उपयोगकर्ता है, तो यह ठीक है। यदि आप नहीं करते हैं, तो आप जटिलताओं में भाग लेंगे। ऐसा करके आप बहुत सारे प्रश्नों का एक नरक भी चलाएंगे।

मुझे थोड़ी देर के लिए दृढ़ता से आश्वस्त किया गया है कि PHP और लंबे मतदान केवल PHP के कारण काम नहीं करते हैं क्योंकि कोई क्रॉस-क्लाइंट ईवेंट-संचालित संभावनाएं नहीं हैं। इसका मतलब है कि आपको घटनाओं पर भरोसा करने के बजाय हर दूसरे/2s/5s में अपना डेटाबेस जांचना होगा।

यदि आप अभी भी ऐसा करना चाहते हैं, तो मैं आपकी संदेश प्रणाली को किसी फ़ाइल में [nameofuser] .txt लिखूंगा जब भी उपयोगकर्ता के पास संदेश हो, और इस ट्रिगर का उपयोग करके संदेश अस्तित्व की जांच करें। अगर फ़ाइल मौजूद है और खाली नहीं है, तो संदेश प्राप्त करने के लिए अनुरोध को बंद करें, प्रक्रिया करें, वापस फ़ीड करें और फिर टेक्स्ट फ़ाइल हटाएं। इससे आपकी डिस्क ओवरहेड कम हो जाएगी, जबकि (यदि आप सावधान नहीं हैं) तो अपनी डिस्क IO को बढ़ाएं।

संरचना-वार, एक सहयोगी तालिका अब तक का सबसे अच्छा है। तीन कॉलम के साथ स्थिति की जांच करने के लिए समर्पित एक नई तालिका बनाएं: user_idmessage_idread_at। उपयोग स्पष्ट होना चाहिए। वहां कोई भी संयोजन अपठित नहीं है।

2

last_checked के रूप में नया कॉलम जोड़ने के बजाय आप last_checked_time के रूप में जोड़ सकते हैं। ताकि आप last_checked_time से current_time पर डेटा प्राप्त कर सकें।

(i.e) DATA BETWEEN `last_checked_time` AND `current_time` 
1

इसके बजाय last_checked नाम के एक स्तंभ बनाने के लिए, आप एक स्तंभ कहा जाता है बना सकते हैं: जाँच की। यदि आप डेटाबेस में सभी संदेश सहेजते हैं, तो आप डेटाबेस में फ़ील्ड को अपडेट कर सकते हैं। उदाहरण:

  1. उपयोगकर्ता 1 उपयोगकर्ता 2 को एक संदेश भेजता है।
  2. PHP लंबे मतदान प्रणाली का उपयोग कर संदेश प्राप्त करता है और संदेश को तालिका में सहेजता है।
  3. उपयोगकर्ता 2, ऑनलाइन होने पर, सर्वर को सिग्नल भेज देगा, सर्वर को सूचित करेगा कि उपयोगकर्ता 1 संदेश प्राप्त करने के लिए तैयार है
  4. सर्वर उन सभी संदेशों के लिए तालिका की जांच करता है जो 'चेक' नहीं हैं और उन्हें वापस कर देते हैं।
संबंधित मुद्दे