2010-02-18 11 views
27

मुझे पता है कि यह प्रश्न यहां दो बार पूछा गया है, लेकिन किसी भी उत्तर ने मुझे प्रसन्न नहीं किया था। ऐसा इसलिए है क्योंकि उनमें से लगभग डेटाबेस से संबंधित एक बड़ी पढ़ने/लिखने की प्रक्रिया शामिल है, जिसे मैं हर कीमत से बचना चाहता हूं।PHP मंच - अपठित चर्चाओं/विषयों/पदों का सामना कैसे करें

अपठित चर्चाओं/विषयों/पदों के बारे में सोचने के लिए बहुत कुछ है। मुझे नहीं पता कि MyBB, vBulletin, Invision Power Board, Vanilla, phpBB इत्यादि जैसे फोरम सिस्टम कैसे हैं, इस समस्या का सामना करते हैं, इसलिए मैं आपसे लोगों से अपने अनुभव को पढ़ना चाहता हूं। मुझे पता है कि इसके लिए डेटाबेस तालिका का उपयोग करना सबसे आसान तरीका है, लेकिन इसमें समुदाय के 10,000 से अधिक सदस्य और 1000 नए विषय होने पर एक विशाल पढ़ने/लिखना शामिल होगा। यह मुश्किल है, लेकिन सर्वर के ओवरलोडिंग से बचने का एक तरीका होना चाहिए।

तो, आप इस मुद्दे के लिए सर्वोत्तम प्रथाओं के साथ-साथ अन्य फ़ोरम सिस्टम इसका सामना कैसे करते हैं?

उत्तर

15

बहुत सारे विकल्प नहीं हैं।

  1. प्रत्येक उपयोगकर्ता द्वारा प्रत्येक पाठक धागे को चिह्नित करें।

    • नुकसान: बहुत सक्रिय मंचों में बहुत सी पंक्तियाँ
    • लाभ: पोस्ट के साथ प्रत्येक उपयोगकर्ता जानता है या पढ़ा है नहीं।
  2. प्रत्येक उपयोगकर्ता द्वारा प्रत्येक अपठित धागे को चिह्नित करें।

    • नुकसान: "unreaded" पंक्तियों के साथ अंतरिक्ष के एक बहुत अगर वहाँ उन
    • समाधान का एक बहुत की निष्क्रियता है: एक जीवन भर टाइमस्टैम्प एक क्रॉन साथ पुराने रिकॉर्ड को जोड़ने और हटाने
    • लाभ: प्रत्येक उपयोगकर्ता पोस्ट के साथ जानता है पढ़ा है या नहीं।
  3. यह निर्धारित करने के लिए टाइमस्टैम्प का उपयोग करें कि यह अपठित या नहीं दिखाया गया है या नहीं।

    • नुकसान: उपयोगकर्ताओं, के साथ वास्तविक अपठित धागे हैं पता नहीं है के निशान केवल अंतिम प्रवेश के बाद 'नई trheads "दिखाने
    • लाभ: सहेजें अंतरिक्ष

दूसरा विकल्प मिश्रण समाधान है, यानी

1 और 3) थ्रेड को "अपठित" के रूप में दिखाएं यदि वे X दिनों से पुराने नहीं हैं और उपयोगकर्ता के लिए पढ़ने के लिए चिह्नित पंक्ति नहीं है। "पढ़ने" पंक्तियों को हटाया जा सकता है जब वे X दिन पुराने होते हैं, कुछ भी प्रभावित किए बिना।

लाभ

  • कम अपठित धागे
  • का निर्धारण किया जाता स्थान दिया गया है

नुकसान

  • एक क्रॉन कि इस प्रणाली को साफ रखता है बनाने
  • उपयोगकर्ता अगर वे पढ़ नहीं जानते एक्स दिनों की तुलना में धागे बूढ़े।

लाभ

  • प्रत्येक उपयोगकर्ता जानता है जो "नई पोस्ट" या नहीं पढ़ा है।
+0

मुझे अभी भी लगता है कि ऐसा करने का एक आसान तरीका होना चाहिए। मैंने MemCache का उपयोग करने के बारे में सोचा, लेकिन यह स्मृति पर निर्भर करता है, और मैं अभी भी एपीसी के बारे में सोच रहा हूं। अगर मेरे पास काम करने के लिए कुछ प्रकार की कैश फ़ाइल हो सकती है, तो शायद मदद मिलेगी। – yoda

1

आप क्यों चिंतित हैं?

मुझे अपठित धागे प्राप्त करने के लिए किसी भी I/O के साथ कोई समस्या नहीं दिखाई दे रही है। यह जीना नहीं है। कैश वैल्यू के आधार पर 15 मिनट की देरी काम करेगी।

तो अपठित धागे तुम सिर्फ

छद्म कोड के लिए

..

$result = SELECT id,viewcount from my_forum_threads 

$cache->setThreads($result['id'],$result['viewcount']); 

फिर एक पृष्ठ लोड पर तुम सिर्फ कैश मूल्यों बल्कि डेटाबेस फिर से क्वेरी करने से मिलता है। यह वास्तव में एक बड़ा मुद्दा नहीं है।

मेरी वेबसाइट पर औसत पृष्ठ 20 mysql प्रश्नों को लेता है। जब मैं कैश करता हूं तो यह केवल दो से चार प्रश्न हैं।

+0

प्रत्येक उपयोगकर्ता के धागे को देखा/खोला गया क्या है? आप जो सुझाव देते हैं वह यह इंगित करता है कि मैं हर उपयोगकर्ता की जानकारी को कैश करता हूं ... – yoda

+0

सत्र शुरू होने पर या कुछ निश्चित समय के बाद आप इसे लोड करते हैं। कैश सत्र में है, एक बड़ा स्थायी कैश नहीं है। – jmucchiello

1

लगभग किसी भी मंच को मैं जानता हूं कि किसी थ्रेड/संदेश को "अपठित" या नहीं माना जाना चाहिए या नहीं, यह निर्धारित करने के लिए किसी भी प्रकार का संदर्भ टाइमस्टैम्प का उपयोग करेगा। यह टाइमस्टैम्प आम तौर पर फ़ोरम की पिछली विज़िट पर किए गए अंतिम क्रिया की दिनांक/समय है।

तो आप यानी रखें। पिछली_last_action & आपकी उपयोगकर्ता तालिका में last_action टाइमस्टैम्प, अंतिम उपयोगकर्ता प्रत्येक उपयोगकर्ता कार्रवाई पर अपडेट किया जाता है, पिछला_last_action कॉलम लॉग इन करते समय अंतिम_एक्शन पर सेट किया जाता है (या नए सत्र के निर्माण पर - यदि आपके पास "मुझे याद रखें" कार्यक्षमता है)। यह निर्धारित करने के लिए कि कोई थ्रेड/संदेश अपठित है या नहीं, आप वर्तमान में लॉग इन किए गए उपयोगकर्ता के लिए पिछले_last_action में मान के साथ उस थ्रेड/संदेश निर्माण (या अपडेट) टाइमस्टैम्प की तुलना करेंगे।

+0

बेहतर फ़ोरम सॉफ़्टवेयर आपको कम से कम प्रति फ़ोरम फ़ोरम प्रदान करेगा। चरम फोरम सॉफ़्टवेयर वास्तव में आपके द्वारा पढ़े गए ट्रैक का ट्रैक रखता है। – jmucchiello

+0

कुछ नया नहीं, क्षमा करें। बात यह है कि आखिरी उपयोगकर्ता गतिविधि छेद फोरम को रेडर्ड करती है, प्रत्येक थ्रेड नहीं, जिसका मतलब है कि इसके लिए ठीक से काम करने के लिए मुझे अभी भी प्रत्येक थ्रेड के बारे में टाइमस्टैम्प ट्रैक करना होगा। – yoda

+4

एक छेद मंच क्या है? क्या यह 'dev/null' की तरह है? –

8

वहाँ एक और है।

एक पदानुक्रमित मंच संरचना (बोर्ड> अनुभाग> धागा, आदि) के लिए विस्तृत पढ़ने/अपठित डेटा स्टोर करने का एक और तरीका। यह बिना किसी के करता है) पढ़ने/अपठित जानकारी को पूर्व-पॉप्युलेट करना है, और बी) अपने सबसे खराब मामले में यू * (एम/2) पंक्तियों से अधिक स्टोर किए बिना, जहां यू उपयोगकर्ताओं की संख्या है, और एम है डेटाबेस में पोस्ट की कुल संख्या (और आमतौर पर बहुत अधिक, इससे कम)

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

[user_id, board, last_msg_id, last_timestamp]

[user_id, बोर्ड, मंच, last_msg_id, last_timestamp]

[user_id, बोर्ड, मंच, subforum, last_msg_id, last_timestamp]

[user_id, बोर्ड, मंच, subforum, विषय, last_msg_id , last_timestamp]

इससे उपयोगकर्ता विशिष्ट बोर्ड, मंच, विषय इत्यादि को "पढ़ा" के रूप में चिह्नित कर सकते हैं। हालांकि, उपयोगकर्ता के हिस्से (या तो पढ़कर, या सक्रिय रूप से "पढ़ने के रूप में चिह्नित" पर क्लिक करके) की आवश्यकता होती है, और phpBB के मामले में, आपको यह कहने के लिए ग्रैन्युलरिटी नहीं दी जाती है "मैंने यह विशिष्ट देखा है संदेश, लेकिन वह विशिष्ट संदेश नहीं। " आपको वह स्थिति भी मिलती है जहां आपने पहले किसी विषय में अंतिम संदेश पढ़ा था (थ्रेड में नवीनतम गतिविधि देखना), और आपको तुरंत बाकी धागे को पढ़ने के लिए माना जाता है।

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

आप इस तरह tuples में संदेशों को संग्रहीत: [user_id, lower_msg_id, upper_msg_id]

उपयोगकर्ता इतिहास लॉग के रूप में बनाए रखा है निम्नलिखित:

पृष्ठ दृश्य पर, एक समारोह अगर user_id एक को देखने के लिए लग रहा है रिकॉर्ड करें जहां current_msg_id low_msg_id और upper_msg_id के बीच है। यदि यह है, तो यह पृष्ठ पढ़ा जाता है, और कोई कार्रवाई की आवश्यकता नहीं है। यदि ऐसा नहीं है, तो एक और क्वेरी जारी की जानी चाहिए, इस बार यह निर्धारित करना है कि current_msg_id या तो low_msg_id (current_msg_id == lower_msg_id-1) से कम है, या upper_msg_id (current_msg_id == upper_msg_id +1) से अधिक है। यह वह मामला है जहां हम अपनी "पढ़ी" या "देखी गई" सीमा को 1 तक बढ़ाते हैं। यदि हम low_msg_id या uppper_msg_id से दूर हैं, तो हम उस दिशा में 1 तक टुपल बढ़ाते हैं। अगर हम अपनी ट्यूपल रेंज नहीं बढ़ा रहे हैं, तो हम एक नया टुपल, [user_id, current_msg_id, current_msg_id] डालते हैं।

कॉर्नर केस तब होता है जब दो ट्यूपल श्रेणियां एक दूसरे से संपर्क करती हैं। इस मामले में, निचले ट्यूपल सीमा और ऊपरी ट्यूपल सीमा के बीच खोज करने पर, निचले टुपल की ऊपरी सीमा को ऊपरी टुपल की ऊपरी सीमा तक सेट करके दो ऊपरी सीमाओं को मर्ज करें, और ऊपरी ट्यूपल को हटा दें। PHP में

कोड उदाहरण: जहां current_msg_id किसी भी lower_msg_id के बीच मौजूद नहीं है तथा उसे किसी उपयोगकर्ता के लिए upper_msg_id (एक नहीं एसक्यूएल मामले में क्वेरी मौजूद है)

function seen_bounds($usr_id, $msg_id) { 

    # mysql escape 
    $usr_id = mres($usr_id); 
    $msg_id = mres($msg_id); 

    $seen_query = " 
     SELECT 
      msb.id, 
      msb.lower_msg_id, 
      msb.upper_msg_id 
     FROM 
      msgs_seen_bounds msb 
     WHERE 
      $msg_id BETWEEN msb.lower_msg_id AND msb.upper_msg_id AND 
      msb.usr_id = $usr_id 
     LIMIT 1; 
    "; 

    # See if this post already exists within a given 
    # seen bound. 
    $seen_row = query($seen_query, ROW); 

    if($seen_row == 0) { 
     # Has not been seen, try to detect if we're "near" 
     # another bound (and we can grow that bound to include 
     # this post). 
     $lower_query = " 
      SELECT 
       msb.id, 
       msb.lower_msg_id, 
       msb.upper_msg_id 
      FROM 
       msgs_seen_bounds msb 
      WHERE 
       msb.upper_msg_id = ($msg_id - 1) AND 
       msb.usr_id = $usr_id 
      LIMIT 1; 
     "; 

     $upper_query = " 
      SELECT 
       msb.id, 
       msb.lower_msg_id, 
       msb.upper_msg_id 
      FROM 
       msgs_seen_bounds msb 
      WHERE 
       msb.lower_msg_id = ($msg_id + 1) AND 
       msb.usr_id = $usr_id 
      LIMIT 1; 
     "; 

     $lower = query($lower_query, ROW); 
     $upper = query($upper_query, ROW); 

     if($lower == 0 && $upper == 0) { 
      # No bounds exist for or near this. We'll insert a single-ID 
      # bound 

      $saw_query = " 
       INSERT INTO 
        msgs_seen_bounds 
       (usr_id, lower_msg_id, upper_msg_id) 
       VALUES 
       ($usr_id, $msg_id, $msg_id) 
       ; 
      "; 

      query($saw_query, NONE); 
     } else { 
      if($lower != 0 && $upper != 0) { 
       # Found "near" bounds both on the upper 
       # and lower bounds. 

       $update_query = ' 
        UPDATE msgs_seen_bounds 
        SET 
         upper_msg_id = ' . $upper['upper_msg_id'] . ' 
        WHERE 
         msgs_seen_bounds.id = ' . $lower['id'] . ' 
        ; 
       '; 

       $delete_query = ' 
        DELETE FROM msgs_seen_bounds 
        WHERE 
         msgs_seen_bounds.id = ' . $upper['id'] . ' 
        ; 
       '; 

       query($update_query, NONE); 
       query($delete_query, NONE); 
      } else { 
       if($lower != 0) { 
        # Only found lower bound, update accordingly. 
        $update_query = ' 
         UPDATE msgs_seen_bounds 
         SET 
          upper_msg_id = ' . $msg_id . ' 
         WHERE 
          msgs_seen_bounds.id = ' . $lower['id'] . ' 
         ; 
        '; 

        query($update_query, NONE); 
       } 

       if($upper != 0) { 
        # Only found upper bound, update accordingly. 
        $update_query = ' 
         UPDATE msgs_seen_bounds 
         SET 
          lower_msg_id = ' . $msg_id . ' 
         WHERE 
          msgs_seen_bounds.id = ' . $upper['id'] . ' 
         ; 
        '; 

        query($update_query, NONE); 
       } 
      } 
     } 
    } else { 
     # Do nothing, already seen. 
    } 

} 

अपठित पोस्ट के लिए खोज हो रही है। एक संबंधपरक डेटाबेस में कार्यान्वित करते समय यह सबसे कुशल प्रश्न नहीं है, लेकिन आक्रामक अनुक्रमण द्वारा हल किया जा सकता है। उदाहरण के लिए, निम्न, किसी उपयोगकर्ता अपठित पोस्ट की गणना के लिए एक SQL क्वेरी है चर्चा क्षेत्र ("आइटम") द्वारा समूहीकरण कि पदों में हैं:

$count_unseen_query = " 
    SELECT 
     msgs.item as id, 
     count(1) as the_count 
    FROM msgs 
    WHERE 
    msgs.usr != " . $usr_id . " AND 
    msgs.state != 'deleted' AND 
    NOT EXISTS (
     SELECT 1 
     FROM 
      msgs_seen_bounds msb 
     WHERE 
      msgs.id BETWEEN msb.lower_msg_id AND msb.upper_msg_id 
      AND msb.usr_id = " . $usr_id . " 
    ) 
    GROUP BY msgs.item 
    ; 

अधिक उपयोगकर्ताओं को मंच पर पढ़ा, प्रत्येक ट्यूपल द्वारा पढ़ने के रूप में चिह्नित सीमाओं को व्यापक करें, और कम tuples को संग्रहीत किया जाना चाहिए। उपयोगकर्ताओं को पढ़ने बनाम सटीक गिनती मिल सकती है।अपठित, और प्रत्येक फोरम, सबफोरम, विषय इत्यादि में पढ़ने बनाम अपठित देखने के लिए आसानी से समेकित किया जा सकता है

2000+ पदों के एक छोटे से मंच को देखते हुए, निम्नलिखित संग्रहित tuples की संख्या के बारे में उपयोग आंकड़े हैं , उपयोगकर्ताओं द्वारा लॉग इन किए गए कई बार क्रमबद्ध (उपयोगकर्ता गतिविधि अनुमानित)। कॉलम "num_bounds" उपयोगकर्ता के "num_posts_read" देखने के इतिहास को संग्रहीत करने के लिए आवश्यक टुपल्स की संख्या है।

id num_log_entries num_bounds num_posts_read num_posts 
479    584   11   2161  228 
118    461   6   2167  724 
487    119   34   2093  199 
499    97   6   2090  309 
476    71  139   481  82 
480    33   92   167  26 
486    33  256   757  154 
496    31  108   193  51 
490    31   80   179  61 
475    28  129   226  47 
491    22   22   1207  24 
502    20  100   232  65 
493    14   73   141   5 
489    14   12   1517  22 
498    10   72   132  17 

मैं किसी भी मंच पर इस विशेष कार्यान्वयन लेकिन मेरे स्वयं के कस्टम एक नहीं देखा है, और यह कि एक छोटा सा एक है। मुझे दिलचस्पी होगी अगर किसी और ने लागू किया है, या इसे कहीं और लागू किया है, खासकर बड़े और/या सक्रिय मंच में।

सादर,

Kaiden

+0

यदि संभव हो तो मैं उस के एक प्रैक्टिकल कार्यान्वयन को देखना चाहता हूं :) – yoda

+0

@yoda, सुनिश्चित नहीं है कि आप क्या पूछ रहे हैं। मेरे पास कोडिंग कोड है, लेकिन क्या यह एसक्यूएल-इंजेक्शन सबूत है या नहीं, यह सुनिश्चित नहीं है कि मैं चल रहे इंस्टेंस को इंटरनेट की भयावहता का खुलासा करना चाहता हूं। कोड शामिल करने के लिए StackOverflow पर एक उदाहरण सेट क्या है? क्या यह उत्तर का हिस्सा बनने की उम्मीद है, या टिप्पणियों में (जो बहुत कमजोर हैं), या पेस्ट.ई जैसी दूसरी सेवा में ऑफ़-साइट? लेमे पता है। – Kaiden

+0

आप इसे केवल मुझे दिखा सकते हैं, अगर आप उससे सहमत हैं और अपने कोड को सभी को बेनकाब नहीं करना चाहते हैं। आप pastebin.com का उपयोग कर सकते हैं और जीमेल डॉट कॉम पर कोड को एओन डॉट योड को भेज सकते हैं। में सहारना करता! – yoda

0

मैं सभी जवाब पढ़ लिया है और मैं एक विचार इस विषय के लिए सबसे अच्छा मिश्रण हो सकता है कि (कोई कोड यद्यपि) के साथ आया था।
यह विचार आपके सभी विचारों का मिश्रण है और प्रोग्रामिंग में मेरे पास थोड़ा सा अनुभव है
उपयोगकर्ताओं का अपरॉक्स 95% (आंकड़े एक फोरम व्यवस्थापक और उनके फोरम लॉग से प्राप्त होते हैं) फोरम के विषयों को सीधे अंतिम पोस्ट पर पढ़ते हैं (या पृष्ठ) और वापस मत जाओ, पहले पृष्ठों की पोस्ट (या केवल पहली पोस्ट) पढ़ें और फिर अंतिम पृष्ठ पर जाएं, या वे शुरुआत से पूरे धागे को पढ़ते हैं 'अंत तक और यदि वे वापस आते हैं पहले से ही उस हिस्से को पढ़ा था। तो एक अच्छा समाधान इस तरह काम करेगा:
मुझे लगता है कि अगर हम प्रत्येक उपयोगकर्ता के लिए प्रत्येक थ्रेड के लिए एक स्टोर बनाते हैं, तो उपयोगकर्ता द्वारा देखी गई अंतिम पोस्ट का टाइमस्टैम्प (और, यदि लागू हो, तो उपयोगकर्ता द्वारा पोस्ट की गई पहली पोस्ट जो उपयोगी नहीं हो सकता है) हम इसके साथ कहीं भी मिल सकते हैं। प्रणाली बहुत सरल है और लगभग phpbb की तरह है। यह उस अंतिम पोस्ट को चिह्नित करने के लिए भी उपयोगी होगा जिसे हमने बाद में जारी रखा है (इसके बजाय उस पृष्ठ को पढ़ने के लिए मजबूर होने के बजाय)। और, जैसा कि प्रत्येक धागे की अपनी आईडी है। Phpbb करता है जैसे व्यवस्थित करने की कोई आवश्यकता नहीं है।

1

कैसे (मुझे लगता है कि) पर एक त्वरित जवाब IPB यह करता है: के रूप में पढ़ा

सभी config राशि से अधिक उम्र (डिफ़ॉल्ट 30 दिन) पोस्ट को अपने आप चिह्नित कर रहे हैं। आकार को व्यवस्थित रखने के लिए प्रत्येक उपयोगकर्ता से एक cronjob prunes।

30 दिनों से कम उम्र के सभी पोस्ट प्रत्येक उपयोगकर्ता आईडी + श्रेणी के लिए JSON प्रविष्टि के रूप में ट्रैक किए जाते हैं। पूर्व: 1000 सक्रिय उपयोगकर्ताओं के साथ 12 श्रेणियां = अधिकतम 12,000 पंक्तियां।

फोरम होम, या कहीं और के लिए त्वरित लुकअप के लिए "अपठित गिनती" फ़ील्ड है, बस किसी संख्या की आवश्यकता है।

मैं वास्तविक MySQL स्टोरेज पर पूरी तरह से बंद हो सकता था। मुझे इस पर प्रलेखन नहीं मिला, लेकिन मैंने डेटाबेस के माध्यम से खोला और एक टेबल देखा जो/देखा/पढ़ने/अपठित धागे की तरह (तालिका: core_item_markers, संदर्भ के लिए)। लेकिन मैं संकर उम्र/mysql मॉडल पर सकारात्मक हूँ।

2

गैर वास्तव में एक PHP-जवाब, लेकिन यहाँ हम कैसे में ऐसा है हमारे asp.net-based forum (मैं का खुलासा, इस उत्पाद के साथ संबद्ध कर रहा हूँ कि नियमों के कारण) हम कुकीज़, नहीं का उपयोग

  1. डेटाबेस।
    • नुकसान कुकीज़ के - नहीं "क्रॉस-उपकरण"
    • लाभ (किसी अन्य कंप्यूटर से जाकर अपठित के रूप में सब कुछ पता चलता) - कोई बड़ा डीबी पढ़ता/लिखता है। और "अतिथि" उपयोगकर्ताओं के लिए भी काम ट्रैकिंग! यह कमाल का है।
  2. हम उपयोगकर्ता द्वारा आने वाले प्रत्येक विषय के लिए { topicID, lastReadMessageID } जोड़े के साथ एक कुकी स्टोर करते हैं।
  3. एक विशेष विषय के लिए डेटा कुकी में नहीं मिलता है, तो हम यह मान विषय या तो है:
    • पूरी तरह से बिना पढ़े (यदि विषय के अंतिम संदेश अधिक से अधिक है मैक्स lastReadMessageID से (2)
    • पूरी तरह से पढ़ा (अन्यथा यदि)

यह कुछ मामूली खामियां है, लेकिन यह काम करता है।

पुनश्च। इसके अलावा, कुछ लोग कह सकते हैं कि कुकीज़ का उपयोग उपयोगकर्ता के कंप्यूटर पर कचरा छोड़ देता है (मुझे व्यक्तिगत रूप से इससे नफरत है), लेकिन हमने पाया कि औसत उपयोगकर्ता लगभग 20 विषयों को ट्रैक करता है, इसलिए इसमें प्रति विषय लगभग 10 बाइट लगते हैं, इसलिए 200 बाइट से कम लेता है उपयोगकर्ता के हार्डड्राइव पर।

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