क्या ग्राहकों का कचरा एकत्र किया जाता है?


61

यह सवाल मुझे सोचकर मिला है कि क्षणिक RSS ने wp_options में फ़ीड स्वचालित रूप से नहीं निकाली है?

ग्राहकों को समाप्त करने और हटाने के लिए माना जाता है। हालाँकि, मुझे यह देखने का एकमात्र तरीका यह है कि जब क्षणिक की समय सीमा समाप्त हो जाती है और अनुरोध किया जाता है, तो अनुरोध के दौरान इसे हटा दिया जाता है।

क्या होगा यदि क्षणिक की समय सीमा समाप्त हो गई है लेकिन उसके बाद कभी अनुरोध नहीं किया गया है? कोडेक्स में विवरण से मुझे लगा कि किसी प्रकार का कचरा संग्रह निहित है। अब मुझे यकीन नहीं है और ऐसा कोई भी कोड नहीं मिल सकता है जो इस तरह का प्रदर्शन करे।

तो क्या यह सिर्फ डेटाबेस में हमेशा के लिए अटक जाएगा?


सैद्धांतिक रूप से उन्हें हटा दिया जाना चाहिए जब क्रोन चलाया जाता है (यदि वे समाप्त हो गए हैं)
onetrickpony

1
@ महत्वाकांक्षी अमीबा हां, मैंने सवाल में उल्लेख किया है। मेरा कहना है - क्षणिक बनाया जा रहा है या यह गारंटी नहीं है कि यह कभी अनुरोध किया जा रहा है। मूल प्रश्न तनावपूर्ण - जब और यदि समय सीमा समाप्त हो जाती है तो मैं इसे कभी नहीं प्राप्त करता हूं ?
रारस्ट

1
यह मानता है कि आप समाप्त हो चुके डेटा को साफ़ कर देते हैं, लेकिन हाँ, आप सही हैं, ऐसी स्थितियाँ हैं जिनमें यह कभी नहीं मिटेगा। जैसे कि विजेट का उपयोग करना, जो ग्राहकों का उपयोग करता है। आपको इसके लिए
टीआरसी

1
@ रारस्ट - टीआरईसी के लिए एक पैच लिखने और सबमिट करने के लिए एक सही चीज़ की तरह लगता है?
मिकशिंकेल

जवाबों:


45

वे अब हैं

वर्डप्रेस 3.7 के साथ शुरू की गई अवधि समाप्त हो चुकी है, डेटाबेस अपग्रेड पर ग्राहकों को हटा दिया जाता है, # 20316 देखें


पुराना उत्तर

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

यदि संग्रहण के लिए डेटाबेस का उपयोग किया जाता है तो कचरा संग्रह करने के लिए कुछ अस्थायी कोड:

add_action( 'wp_scheduled_delete', 'delete_expired_db_transients' );

function delete_expired_db_transients() {

    global $wpdb, $_wp_using_ext_object_cache;

    if( $_wp_using_ext_object_cache )
        return;

    $time = isset ( $_SERVER['REQUEST_TIME'] ) ? (int)$_SERVER['REQUEST_TIME'] : time() ;
    $expired = $wpdb->get_col( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout%' AND option_value < {$time};" );

    foreach( $expired as $transient ) {

        $key = str_replace('_transient_timeout_', '', $transient);
        delete_transient($key);
    }
}

$ समय = $ _SERVER ['REQUEST_TIME']; और फिर SQL क्वेरी में $ समय का उपयोग करना - ऐसा मत करो। SQL इंजेक्शन को रोकने के लिए $ _SERVER चर / मान के साथ अधिक सावधानी से व्यवहार करें।
हकरे

@ हक्रे ह्म ... मैंने इसे PHP प्रदर्शन पर प्रस्तुति से लिया, जिसने इसे उपयोग करने की सिफारिश की time()जिसके कारण कीड़े हो सकते हैं (निष्पादन प्रकृति द्वारा तत्काल नहीं है)। अनुरोध समय PHP द्वारा निर्धारित किया जा रहा है, किसी भी प्रकार के उपयोगकर्ता-आपूर्ति डेटा से नहीं आता है। यह भेद्यता क्यों है?
रार्स्ट

@ सार: मैंने यह नहीं कहा कि आपको इसका उपयोग नहीं करना चाहिए, आपको बस यह सुनिश्चित करना चाहिए कि यह SQL क्वेरी के अंदर उपयोग करने के लिए सुरक्षित रूप से एन्कोडेड है। आपको बाहरी स्रोत से प्रत्येक चर के साथ ऐसा करना चाहिए। $ _SERVER चर को उम्मीद के मुताबिक सेट नहीं किया जा सकता है, और इसके बजाय, अनुरोध करने वाले उपयोगकर्ता द्वारा भी सेट किया जा सकता है। मैं केवल कुछ अच्छे कोडिंग अभ्यास का प्रचार करना चाहता था। हमेशा की तरह, उपलब्धता की वास्तविक स्थिति के बारे में जानने के लिए, डॉक्स देखें। उदाहरण के लिए PHP 4 के लिए, ऐसा वैरिएबल मौजूद नहीं है और कस्टम हेडर या एनवायरनमेंट वेरिएबल - php.net/manual/en/reserved.variables.server.php
hakre

@hakre फिक्स्ड (मुझे लगता है), PHP4 रिमाइंडर btw के लिए धन्यवाद (मैं वर्डप्रेस के लिए इसका समर्थन छोड़ने के लिए इंतजार नहीं कर सकता)
Rarst

मेरी नज़र में यह बहुत बेहतर है;)। आइए आशा करते हैं कि समय के साथ कोई समस्या नहीं है () और नकारात्मक पूर्णांक जो दुर्घटना से सभी या कोई भी ग्राहक हटा सकते हैं। कभी भी रनिंग सिस्टम पर भरोसा न करें: P
hakre

20

चर्चा से कुछ टिप्पणियों को एक उत्तर में स्थानांतरित करना, फिर से शब्दांकन और पुन: स्वरूपण के साथ ।।

असल में, यह क्या है कि जब तक आपके पास एक सुपर चरम मामला नहीं है, तब तक उन्हें वास्तव में "कचरा एकत्र" करने की आवश्यकता नहीं है। यदि आप उन्हें कभी नहीं लेते हैं, तो इससे कोई फर्क नहीं पड़ता कि वे वहां हैं या नहीं।

देखें, ग्राहक डिफ़ॉल्ट रूप से विकल्प तालिका में संग्रहीत किए जाते हैं। बेस इंस्टॉल में, विकल्प तालिका में शायद 100 प्रविष्टियां होंगी। प्रत्येक क्षणिक दो और प्रविष्टियाँ जोड़ता है, लेकिन यदि आपके पास हजारों हैं, तो भी वे साइट की गति को प्रभावित नहीं करते हैं, क्योंकि वे ऑटोलॉइड नहीं हैं।

स्टार्टअप पर, वर्डप्रेस विकल्पों को स्मृति में लोड करता है, लेकिन यह केवल उन विकल्पों को लोड करता है जिनके पास अपना ऑटोलॉड ध्वज है। ग्राहकों को यह नहीं मिलता है, और इसलिए स्मृति में लोड नहीं होता है। बाद में वास्तव में उपयोग किए जाने वाले केवल ट्रांजिस्टर ही लागत वसूलेंगे।

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

डेटाबेस में अनुक्रमण उन गहरे-पढ़े गए विचारों में से एक है जो उन लोगों के लिए कोई मतलब नहीं है जो वास्तव में समझ नहीं पाए हैं कि पर्दे के पीछे क्या चल रहा है। डेटाबेस तेजी से डेटा पुनर्प्राप्ति के लिए डिज़ाइन किए गए हैं, जमीन से ऊपर, और मुद्दों के बिना इस तरह की चीज को संभाल सकते हैं। यह एक बहुत अच्छा पढ़ा है: http://en.wikipedia.org/wiki/Index_(database )

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

यदि आपके पास कुछ मामला है जो नए संक्रमणों के लगातार सम्मिलन का कारण बन रहा है जो उपयोग नहीं किए जा रहे हैं, तो आपको इसके बजाय अंतर्निहित समस्या का पता लगाने की आवश्यकता है। इन ग्राहकों को क्या सम्मिलित कर रहा है? क्या वे एक बदलते या परिवर्तनशील कुंजी का उपयोग कर रहे हैं? यदि ऐसा है, तो इसके कारण प्लगइन या कोड को मूल रूप से तय किया जाना चाहिए, ऐसा नहीं करना चाहिए। यह अधिक उपयोगी होगा, क्योंकि यह संभावना है कि कोड जो उन्हें ठीक से नहीं बना रहा है, उन्हें भी पुनर्प्राप्त नहीं कर रहा है, और इस तरह से अधिक काम करना पड़ता है।

दूसरी ओर, ऐसा मामला भी हो सकता है जहां हर पोस्ट की तरह कुछ के लिए ग्राहक बनाए जा रहे हैं। यह वास्तव में पूरी तरह से स्वीकार्य हो सकता है। मैं फेसबुक से आने वाली टिप्पणियों को स्टोर करने के लिए खुद को एसएफसी में करता हूं। प्रत्येक पोस्ट में एक संभावित क्षणिक जुड़ा होता है, जिसका अर्थ है प्रति पोस्ट दो अतिरिक्त पंक्तियाँ। यदि आपके पास 10k पोस्ट हैं, तो आपके पास विकल्प तालिका (अंततः) में 20k पंक्तियाँ होंगी। यह बुरा या धीमा नहीं है, क्योंकि फिर से, 100 पंक्तियों और 20,000 पंक्तियों के बीच बहुत कम अंतर है जहाँ तक डेटाबेस वास्तव में परवाह करते हैं। यह सब अनुक्रमित है। यह बिल्ली के समान तेज़ है। उप-उप मिलीसेकेंड।

जब आप लाखों पंक्तियों में आने लगते हैं, तो मुझे चिंता होगी। जब विकल्प तालिका का आकार सैकड़ों मेगाबाइट से ऊपर बढ़ जाता है, तो मैं काफी चिंतित होऊंगा। लेकिन आम तौर पर, यह चरम मामलों को छोड़कर एक मुद्दा नहीं है। यह निश्चित रूप से सैकड़ों हजारों पदों के साथ एक बड़ी खबर साइट की तरह कुछ से छोटे के लिए एक मुद्दा नहीं है। और किसी भी साइट के लिए यह एक समस्या होने के लिए पर्याप्त है, आपको किसी प्रकार के बाहरी ऑब्जेक्ट कैश का उपयोग करना चाहिए, और उस स्थिति में, डेटाबेस के बजाय ग्राहकों को स्वचालित रूप से वहां संग्रहीत किया जाता है।


1
नायब: बिना समय सीमा के ट्रांजैक्शन करने वाले ऑटो लोड हो जाते हैं, और कोई भी एक्सपायरी डिफॉल्ट नहीं होती है , इसलिए जहां एक एप्लिकेशन / प्लगइन बहुत सारे ट्रांजैक्शंस पैदा कर रहे हैं और एक्सपीरिएंस सेट नहीं कर रहे हैं, वे हर पेज / पोस्ट लोड पर मेमोरी का हिस्सा इस्तेमाल कर रहे होंगे।
वेबवेयर

"क्षणिक के साथ कोई समाप्ति नहीं" का उपयोग करने का कोई कारण नहीं है, क्योंकि यह मूल रूप से एक सामान्य "विकल्प" के समान है।
ओटो

1
ज़रूर, लेकिन यह डिफ़ॉल्ट है । जैसे, कई प्लगइन लेखक गैर-एक्सपायरिंग ग्राहकों को जोड़ रहे हैं।
वेबवेयर

1
खैर, यहाँ समाधान सरल है: उन प्लगइन्स का उपयोग न करें। वे गलत कर रहे हैं। ग्राहकों को सत्र के रूप में उपयोग नहीं किया जाना चाहिए, आपको उन्हें बिना सार्थक समाप्ति के उपयोग नहीं करना चाहिए, और उनके पास परिवर्तनशील या परिवर्तनशील कुंजी नहीं होनी चाहिए।
ओटो

2
कहते हैं, 7 दिन। यदि कोई प्लगइन / थीम लेखक कुछ बड़ा या छोटा चाहता है, तो वे इसे निर्दिष्ट करेंगे। यदि वे ऑटोलैड चाहते हैं, तो उन्हें समाप्ति (= अनन्तता) के लिए 0 निर्दिष्ट नहीं करना चाहिए, लेकिन यही है, जो वर्तमान में उन्हें समाप्ति पैरामीटर के साथ हाँ / नहीं ऑटोलॉड पैरामीटर के रूप में दोहरा कर्तव्य कर रहे हैं। किसी भी तरह से, डिफ़ॉल्ट समाप्ति भी autoload के लिए नेतृत्व नहीं करना चाहिए = हाँ डिफ़ॉल्ट रूप में; वह सिर्फ परेशानी के लिए पूछ रहा है।
वेबवेयर

18

ओटो - मैं आपसे अधिक असहमत नहीं हो सकता। मुद्दा यह है कि अंततः उन सभी ग्राहकों के साथ, तालिका का आकार हास्यास्पद हो जाता है। यह लाखों पंक्तियों को काट नहीं सकता है। मैं वर्तमान में 130k पंक्तियों वाली एक विकल्प तालिका के साथ काम कर रहा हूं, और नियमित रूप से लटका हुआ हूं। क्योंकि मान फ़ील्ड एक बड़ा पाठ प्रकार है, यहां तक ​​कि केवल "ऑटोलॉड" पंक्तियों की तलाश में प्रदर्शन का एक बुरा सपना बन जाता है। उन मान फ़ील्ड को शेष पंक्ति डेटा से अलग संग्रहीत किया जाता है। भले ही यह तार्किक रूप से एक ही तालिका का हिस्सा हो, लेकिन जोड़ आपको जो पंक्तियाँ चाहिए उन्हें खींचने के लिए होनी चाहिए। जुड़ता है जो अब हमेशा के लिए ले जाता है क्योंकि आपको जिस डेटा की आवश्यकता होती है वह डिस्क पर सभी जगह फैल जाता है। प्रोफाइलिंग (mysql के लिए जेट प्रोफाइलर का उपयोग करके) ने यह साबित कर दिया है।

संकुल कुंजी में स्वतः-लोड जोड़ने से इस समस्या को हल करने में मदद मिल सकती है। उदाहरण के लिए ऑटोलैड डेसक, आईडी एएससी पर क्लस्टरिंग, सभी ऑटोलॉड पंक्तियों को डिस्क पर पहले एक साथ गुच्छा करने की अनुमति देगा। अब भी मुझे लगता है कि आप एक डीबी के नजरिए से बहुत बड़ा तनाव देख रहे हैं।

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


5
सच है, लेकिन विचार करें कि जब वर्डप्रेस का विकास शुरू हुआ, तो किसी ने नहीं सोचा था कि यह विकल्प डेटा टेबल के रूप में उनके डेटा स्टोरेज के रूप में उपयोग करके हजारों प्लगइन्स तक पहुंच जाएगा :)
onetrickpony

@onetrickpony यही कारण है कि हमेशा अपना समय लेना और चीजों को सही करना महत्वपूर्ण है, चाहे आप किसी दिन इसकी बड़ी उम्मीद करें या नहीं :)
महमूद अल-कुद्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.