2012-12-07 13 views
6

मैं बैकएंड मॉड्यूल (PHP में लिखा गया) का निर्माण कर रहा हूं जिसका उपयोग निजी चैट रूम की निगरानी के लिए किया जाएगा, जिसमें [बिल्कुल] 300 सेकंड (5 मिनट) के लिए कोई गतिविधि नहीं है। यदि ऐसा है, तो स्क्रिप्ट डेटाबेस अपडेट करेगा (अधिकतम उपयोगकर्ताओं को एक निश्चित संख्या में सेट करता है, और अन्य सामान)। मैं अब समय() और अंतिम संदेश भेजे गए समय के अंतर से निष्क्रिय समय की अवधि की निगरानी कर रहा हूं।PHP में लगातार डेटाबेस में परिवर्तनों की जांच करने के लिए सबसे अच्छा अभ्यास क्या है?


मैंने क्या किया: एक क्रॉन नौकरी सेट करें जो हर मिनट या 60 सेकंड में मेरी निगरानी स्क्रिप्ट (PHP-cli के माध्यम से) चलाएगी।

$expire_time = time() + 60; 

//this loop will run for 60 seconds 
while(time() < $expire_time) 
{ 
    $idle_time = get_all_chatrooms_idle_time(); 
    foreach($idle_time as $s_time) 
    { 
    if($s_time >= 300) 
    { 
     update_changes(); 
    } 
    } 
    usleep(500000); 
} 

तुरन्त 300 सेकंड के बाद निष्क्रिय समय अधिकतम उपयोगकर्ताओं की स्थापना की हालत भान नहीं किया जा सकता है: निगरानी स्क्रिप्ट के अंदर। तो मैं वास्तव में सलाह का पालन नहीं कर सकता जैसे: "कुछ भी करने से बचें जब तक कि वास्तव में कुछ पूछता न हो" भले ही यह बहुत समझ में आता है।

कारण? सक्रिय और निष्क्रिय चैट रूम का डेटा वास्तविक समय होना चाहिए क्योंकि यह एक डैशबोर्ड पर भी प्रदर्शित किया जाएगा। चैट रूम मॉडरेटर का भुगतान इस पर निर्भर करता है।


क्यों उन्हें हर डैशबोर्ड लोड की जांच नहीं करें? मुझे खेद है लेकिन अभी भी संभव नहीं है।

जांच सर्वर की तरफ होने की आवश्यकता है और डैशबोर्ड खुद को AJAX के साथ अपडेट करता है, हर सेकेंड मतदान करता है।

जब मैं पृष्ठ पर निगरानी कोड संलग्न मेरी ajax कॉल द्वारा अनुरोध किया जा रहा मुझे लगता है कि मेरे वर्तमान कार्यान्वयन की तुलना में अधिक संसाधन गहन है (मुझे ठीक कर लें इम गलत)

मुझे आप संख्या के बारे में कुछ मोटे अनुमान देता हूँ

  • मध्यस्थों सहित chatters की संख्या: ~ 800
  • चैटरूम की संख्या: प्रयोक्ताओं की आप लोड/यातायात हम मिल रहे हैं कल्पना कर सकते हैं ताकि ~ 250
  • (एक्स) चैटरूम मध्यस्थों की संख्या: ~ 50
  • (x) अपने मालिक और उनके कर्मचारियों:

(x) - देख सकते हैं डैशबोर्ड


वहाँ एक बेहतर तरीका है? क्या मैं यह ठीक कर रहा हूँ?

+0

ऐसा लगता है कि आप इसे गलत कर रहे हैं। कभी सीआरओएन नौकरियों के बारे में सुना है? मुझे लगता है कि ऐसा करने का ईश्वरीय तरीका हर 1 मिनट (या उससे कम) के लिए क्रॉन नौकरी स्थापित करना है? जो चयन के साथ सरल MySQL स्क्रिप्ट चलाएगा। – Stranger

+0

http://stackoverflow.com/questions/4834829/php-long-polling-without-excessive-database-access –

+0

@Stranger मैंने किया था? – yowmamasita

उत्तर

1

यह लूप एक ओवरकिल है। यह एक मध्यम सर्वर पर भी एक हजार बार एक मिनट चला सकता है, और यह एक वास्तविक समय-ऐप के लिए भी उच्च CPU उपयोग उत्पन्न करता है। एक काउंटर जोड़ें, और पुनरावृत्ति गिनती देखें। मुझे लगता है कि यह हर AJAX अनुरोध पर प्रसंस्करण की तुलना में और भी अधिक भार उत्पन्न करता है।

सबसे पहले, उस ग्रैन्युलरिटी को निर्धारित करें जिसके साथ आपको जानकारी चाहिए। मान लीजिए कि आप 3 सेकंड ग्रैन्युलरिटी (उदाहरण के लिए हर 3 सेकंड में डेटाबेस के माध्यम से सफाई करना) चुनते हैं - यह संख्या आपके लिए बहुत अधिक हो सकती है, लेकिन यह दिखाती है कि आप ज्यादा खोना नहीं चाहते हैं। AJAX को हर सेकेंड खींचकर COULD कुछ काउंटर देखें जो लगातार एक बार या दो बार क्रॉल करना चाहिए। (चाहे आप वास्तव में ऐसी चीज देखेंगे, आपके काउंटर की प्रकृति पर निर्भर करता है।)

यदि आपके काउंटर सेकंड की सीमा में डेटा पर आधारित होते हैं (उदा। विलम्बित सेकंड की रकम दिखाते हैं, या $/सेकेंड के आधार पर रकम दिखाते हैं) तो दूसरी तरफ AJAX खींचने निरंतर काउंटर प्रदान नहीं करेगा। (यह कभी-कभी दूसरी बार याद आती है या दूसरी बार अपडेट होती है; नेटवर्क कारणों से)।

चयनित ग्रैन्युलरिटी के बावजूद, आपके अंतिम आंकड़े ठीक होंगे, क्योंकि वे पूर्ण टाइमस्टैम्प पर आधारित होते हैं - इससे कोई फर्क नहीं पड़ता कि उनका मूल्यांकन कितना देर हो गया है।

यदि द्वितीय-वार AJAX मतदान का उपयोग चिकनी काउंटर को लागू करने के लिए किया जाता है, तो आप उससे बेहतर कुछ कर सकते हैं: गिनती क्लाइंट पक्ष पर चलनी चाहिए (उदाहरण के लिए उनके दूसरे-वार वृद्धि के साथ मूल्य भेजना: revenue: <span data-inc="25">14432</span> और जेएस के साथ गिनती करना) । काउंटर को रोकने/रीसेट करने की स्थिति की निगरानी करने के लिए केवल एजेक्स लागू करें। फिर आपको केवल यह निर्धारित करने की आवश्यकता है कि कितनी देर तक अधिसूचना देर हो सकती है (उदाहरण के लिए 10 एस) तो काउंटर अधिकतम के लिए ओवरक्रॉल करेंगे। अपेक्षित मूल्य पर वापस ड्रॉप 10s। इस मामले में आपको डीबी क्लीनअप को अधिक बार नहीं चलाया जाना चाहिए (जैसे अंतराल का आधा)। यह उदा। आपके चक्र में 3-सेकंड की नींद के लिए, जो भार को कम करता है।

यदि आप आसानी से किसी भी इंडेक्स के साथ डेटाबेस (या तो इन-रिकॉर्ड या फिक्स्ड) में प्रत्येक चैटरूम की समाप्ति टाइमस्टैम्प जोड़ने का विकल्प चुन सकते हैं जो थोड़ा सा पढ़ने (और अतिरिक्त रूप से प्रति-कक्ष समाप्ति नियमों के लिए अनुमति देता है) के साथ।

+1

PHP यदि आप इसका उपयोग करना चाहते हैं तो PHP काम कर सकता है उदाहरण के लिए बीएल कोड तक आसानी से पहुंचने के लिए उदाहरण है। इसमें केवल एक सेवा (रीयलटाइम ट्रैकिंग के लिए एक सेवा) के रूप में लगातार चलने के साथ समस्याएं हैं। एक सिस्टम पर, जहां आप कम से कम इस स्क्रिप्ट के लिए रनटाइम प्रतिबंध को मार सकते हैं, आप सेट हैं: एक तर्क बनाएं जो अगली संभावित घटना तक उदास() है [उदा। अगली समाप्ति या सबसे छोटी संभावित समाप्ति अवधि]।यदि आपको रनटाइम-प्रतिबंध के साथ रहना चाहिए तो आप अभी भी उस योजना का उपयोग कर सकते हैं जिसका उपयोग आप अब करते हैं (प्रत्येक मिनट में एक मिनट के बाद छोड़कर एक स्क्रिप्ट क्रॉन करें) बस कुछ नींद जोड़ें()! –

+0

मुझे वास्तव में खेद है लेकिन कोड नींद (500000) है जिसे मैं जोड़ना भूल गया। 500 एमएम नींद हमारे सर्वर के औसत विलंबता पर आधारित है जो हमारे अधिकांश ग्राहकों को है। तो ... लूप: अधिकतम 2 कॉल प्रति सेकेंड, अजैक्स पोल: यदि 60 दर्शक हैं, प्रति सेकेंड 60 कॉल। – yowmamasita

+1

ठीक है, और आप इसके साथ सही रास्ते पर हैं। चेक की विलंबता को कम करने की अनुमति देने के लिए क्लाइंट-साइड गिनती के बारे में सुझाव अभी भी लागू होते हैं। स्वतंत्र रूप से, अगली संभावित घटना तक सोने की संभावना भी लागू होती है: यदि आपका चयन कहता है कि अगली समाप्ति एक्स सेकंड के बाद है (यदि कोई वर्तमान मूल्य नहीं है, तो वर्तमान में कोई खुली चैट रूम नहीं है), और सिस्टम में न्यूनतम समाप्ति समय (यहां तक ​​कि संभव कमरे बनाया जा रहा है) वाई सेकेंड है तो आप न्यूनतम (एक्स, वाई) सो सकते हैं बिना जांच को फिर से चलाने की आवश्यकता; और फिर जांचें, संभवतः संसाधित करें और एक नया एक्स निर्धारित करें। –

1

टिप्पणी के अनुसार, मैं node.js जैसी तकनीक का उपयोग करने की अनुशंसा करता हूं, जो एक भी संचालित I/O, एसिंक्रोनस प्लेटफॉर्म पर अनुप्रयोग बनाने के लिए है। यदि चैटरूम एक बाहरी अनुप्रयोग है, तो आप आसानी से सॉकेट खोल सकते हैं और चैट रूम सुन सकते हैं, इसे लॉग कर सकते हैं, उपयोगकर्ताओं की गतिविधि पर जांच कर सकते हैं, और विशिष्ट घटनाओं को सुन सकते हैं। (Socket.io के साथ) Node.js के लिए

+0

(क्या मैं यह सही कर रहा हूं?) चैट संदेश दर्ज करें, फ़ंक्शन update_max_users(), settimeout update_max_users() से 300sec पर cleartimeout – yowmamasita

1
#!/usr/bin/php 
<?php 

if(file_exists('/tmp/chatrooms_cron.lock')) { 
    die('There is already a script running.'); 
} 

file_put_contents('/tmp/chatrooms_cron.lock', 1); // Storing pid would be better 

// Run loop forever 
while(true) 
{ 
    $idle_time = get_all_chatrooms_idle_time(); 

    foreach($idle_time as $s_time) 
    { 
    if($s_time >= 300) 
    { 
     update_changes(); 
    } 
    } 

    sleep(60); 
} 

युक्ति:

मैं अपने महान पर काम पर Node.js का उपयोग कर दिया गया है! रीयलटाइम होगा और ब्राउज़र के साथ यानी 5/यानी 6 तक काम करेगा। यह node.js. में आंतरिक रूप से किया जा सकता है।

setInterval(function() { 
    // Fetch and update peers 
}, 300000); 
संबंधित मुद्दे

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