MODx Evo के लिए CacheAccelerator। डायनेमिक स्निपेट को कैशिंग करके डेटाबेस में प्रश्नों की संख्या को कम करना

सभी को नमस्कार। मैं हाल ही में MODx CMF से मिला। मैं वर्तमान में विकास का एक संस्करण विकसित कर रहा हूं। एक पूरे के रूप में प्रणाली काफी सुखद और बहुत ही लचीली है, हालांकि, करीब से देखने पर, मुझे कई कमियां मिलीं। इसके अलावा, उनमें से कुछ ने मुझे कोई आराम नहीं दिया और मैं इसे छोड़ नहीं सकता जैसा कि यह था।



मैं किसी भी सीएमएस / सीएमएफ - प्रदर्शन के सबसे संवेदनशील मानदंडों में से एक पर ध्यान केंद्रित करूंगा।

सामान्य तौर पर, प्रदर्शन के साथ MODx में सभी नियम होते हैं। उन्होंने खुद को काफी सक्षम, अनुकूलित लिखा है। इसके अलावा, इसके लचीलेपन के कारण, यह डेवलपर को कार्यान्वित की जा रही परियोजना में अड़चनों को प्रबंधित करने की क्षमता देता है।



हालाँकि, मैं केवल Ditto, Jot का उपयोग कर टिप्पणियों आदि का उपयोग करके समाचार आउटपुट को संसाधित करने की विधि से हैरान था। अर्थात्, डिटो में पूरे पृष्ठ के लिए कैशिंग को अक्षम करने की आवश्यकता है (PHx के साथ काम करने में समस्या के कारण) और जोट स्निपेट को लागू करने के लिए।



दरअसल, यदि बहुत सारी प्रविष्टियाँ हैं, तो वे एक पृष्ठ पर फिट नहीं होंगे, जिसका अर्थ है कि, उदाहरण के लिए, एक समाचार फ़ीड को कई पृष्ठों में विभाजित किया जाना चाहिए। लेकिन, यदि इस पृष्ठ के कैशिंग को MODx में शामिल किया जाता है, तो समाचार फ़ीड के कुछ हिस्सों के बीच स्विच करते समय, हम सभी समान सामग्री देखेंगे जो पहले कैश को हिट करते हैं!



आधिकारिक सूत्र क्या सलाह देते हैं?

वे सलाह देते हैं कि कई के साथ काम करने वाले स्निपेट्स

पृष्ठ कभी कैश नहीं किए गए।



यहाँ बिट्टो और जोत को बुलाने के कुछ उदाहरण दिए गए हैं:


स्निपेट कॉल पेज कैश्ड नहीं है "पेज सेटअप => कैशेड => ऑफ"

[[Ditto?

&parents=`1`

&display=`10`

&paginate=`1`

&paginateAlwaysShowLinks=`1`

]]








स्निपेट कॉल पेज "पेज सेटअप => कैशेड => ऑन" कैश्ड है

[!Jot?

&customfields=`name,email`

&pagination=`10`

&badwords=`*****`

&canmoderate=`Site Admins`

&captcha=`1`!]

!]








जैसा कि हम देख सकते हैं, MODx द्वारा कैशिंग दोनों मामलों में नहीं किया जाता है। कैशिंग की कमी सीधे सिस्टम की गति को प्रभावित करती है, क्योंकि हर बार पृष्ठ को कॉल करने के बाद, डेटाबेस से सभी स्निपेट डेटा एकत्र किया जाता है।



मेरे परीक्षणों के अनुसार, प्रति पृष्ठ 10 प्रविष्टियों के साथ डिट्टो कॉल पेज, शीर्षक, संक्षिप्त एनोटेशन और प्रकाशन की तारीख प्रदर्शित करता है, डेटाबेस में लगभग 11 प्रश्न बनाता है। अतिरिक्त फ़िल्टर का उपयोग करके, टीवी के क्षेत्रों में खोज शब्द, और भी अधिक निराशाजनक आंकड़े देंगे।

छवि

डेमो



यही बात जोट कॉल पेज पर भी होती है।

प्रति पृष्ठ 10 टिप्पणियों के साथ जोत को कॉल करें, प्रत्येक के बारे में मानक जानकारी

टिप्पणियां और नए पदों को जोड़ने के लिए एक फॉर्म के साथ, एक आदेश भी बनाता है

22 - 24 डेटाबेस के लिए प्रश्न।

छवि

डेमो



यह तब तक महत्वपूर्ण नहीं है जब तक डेटाबेस बहुत छोटा है, लेकिन डेटाबेस की वृद्धि के साथ, इस तरह के कई अनुरोध दस्तावेजों की संख्या के संबंध में प्रतिक्रिया समय में तेजी से वृद्धि करेंगे।



थोड़ा सोचने के बाद, मैंने एक CacheAccelerator लिखा, जिसमें एक मॉड्यूल, एक स्निपेट और एक तृतीय-पक्ष लाइब्रेरी शामिल थी



कैश एक्सेलेरेटर, किसी भी मनमाने स्निपेट (न केवल डिट्टो और जोत) के आउटपुट को कैशिंग करके, सिस्टम की गति को बढ़ाता है और डेटाबेस के प्रश्नों की संख्या को कम करता है।



परीक्षणों के अनुसार, ऊपर दी गई डिट्टो के साथ पृष्ठ पर बार-बार अनुरोध डेटाबेस से कॉल की संख्या को 11 से घटाकर 3 करने के रूप में परिणाम देता है (!), और जोत के साथ एक पृष्ठ पर, 22 से 1 (!)।

छविछवि



यह उत्पाद MODx इंजन में एकीकरण के किसी भी हैक तरीके का उपयोग नहीं करता है। यह कोड का एक पूरी तरह से अलग ब्लॉक है। स्थापित करने और उपयोग करने के लिए बहुत आसान है।



तो स्थापना:


सबसे पहले, पेज से fileCache डाउनलोड करें:

http://neo22s.com/filecache/



या तो सीधा लिंक:

http://lab.neo22s.com/fileCache/fileCache.zip



निर्देशिका / संपत्ति / प्लगइन्स / cacheaccelerator बनाएँ

कैचेसीलरेटर निर्देशिका में, कैश डायरेक्टरी (/ संपत्ति / प्लगइन्स / कैशेलेरेटर / कैश) बनाएँ

दोनों बनाई गई निर्देशिकाओं पर chmod 777 स्थापित करें



इसके बाद, डाउनलोड किए गए आर्काइव से, fileCache.php को डायरेक्टरी / एसेट्स / प्लगइन्स / कैचेसीलेटर में कॉपी करें



उसके बाद, MODx प्रबंधक में, तत्वों -> नियंत्रण तत्वों -> स्निपेट्स -> नया स्निपेट पर क्लिक करें । CacheAccelerator नाम से एक नया स्निपेट बनाएं।

छवि



छवि



छवि



छवि



हम वहां स्निपेट की सामग्री की नकल करते हैं।



CacheAccelerator स्निपेट:


<?php

// . Ditto

if(!function_exists(cacheFieldsCompare)) {

function cacheFieldsCompare ($param1, $param2, $param3){

/*

1 or !=

2 or =

3 or <

4 or >

5 or <=

6 or >=

7

8

*/

switch($param3){

case 1:

return $param1 != $param2;

break;

case 2:

return $param1 == $param2;

break;

case 3:

return $param1 < $param2;

break;

case 4:

return $param1 > $param2;

break;

case 5:

return $param1 <= $param2;

break;

case 6:

return $param1 >= $param2;

break;

case 7:

return stristr($param1, $param2);

break;

case 8:

return !stristr($param1, $param2);

}

}

}



$nocache = isset($nocache)? $nocache : 0; //

$url = $_SERVER["REQUEST_URI"]; // ,

$path_to_cacheengine=$modx->config['base_path']."assets/plugins/cacheaccelerator/"; // CacheAccelerator

$path_to_cache=$modx->config['base_path']."assets/plugins/cacheaccelerator/cache/"; // ( )

require_once ($path_to_cacheengine."fileCache.php"); // fileCache

$cache = fileCache::GetInstance(84600*7,$path_to_cache);// fileCache



//

if((int)$clearCache){

if($logMessages) echo("Clearing cache...");

$cache->deleteCache(0);

return;

}



// , ( , )

$noCacheGroups = isset($noCacheGroups) ? $noCacheGroups : "";

$nocache = intval($modx->isMemberOfWebGroup(explode("||",$nocacheGroups)) || $modx->checkSession()) ? 2 : $nocache;

if($nocache == 2){

if($logMessages) echo("No caching for this web group.");

}



/* -, . , */

if(isset($dropCacheField)){

$fieldsArray = explode("||", $dropCacheField);

foreach ($fieldsArray as $field){

$field1 = explode(";", $field);

if($field1[1] && $field[2]){

if(empty($field1[0])){

foreach ($_POST as $key => $postField){

if(cacheFieldsCompare($postField, $field1[1], $field1[2])){

$nocache = 1;

continue;

}

}

foreach ($_GET as $key => $getField){

if(cacheFieldsCompare($getField, $field1[1], $field1[2])){

$nocache = 1;

continue;

}

}

} else {

if(!empty($_POST[$field1[0]])){

if(cacheFieldsCompare($_POST[$field1[0]], $field1[1], $field1[2])){

$nocache = 1;

continue;

}

}

if(!empty($_GET[$field1[0]])){

if(cacheFieldsCompare($_GET[$field1[0]], $field1[1], $field1[2])){

$nocache = 1;

continue;

}



}

}

} else {

if(!empty($_POST[$field1[0]]) || !empty($_GET[$field1[0]]))

$nocache = 1;

}

}



//

if($nocache == 1){

if($logMessages) echo(" Clearing cache... ");

$cache->deleteCache(0);

}

}



//

if($nocache == 0){

$cached = $cache->cache($cacheId.$url);

if(isset($cached)){

if($logMessages) echo(" Cache hit! ");

$modx->placeholders = $cached['placeholders']; //

return $cached['content']; //

}

}



$output = $modx->runSnippet($snippetToCache, $modx->event->params); //



//

if($nocache == 0){

if($logMessages) echo("Storing to cache...");

$cache->cache($cacheId.$url,array('placeholders' => $modx->placeholders, 'content' => $output));

}

// MODx

return($output);

?>








हम बनाए गए स्निपेट को बचाते हैं। इसके बाद प्लगइन्स टैब पर जाएं।

प्लग इन पर क्लिक करें

छवि



छवि



इसे CacheAcceleratorClear नाम दें। प्लगइन की सामग्री को इसमें कॉपी करें।



CacheAcceleratorClear प्लगइन:


$path_to_cacheengine=$modx->config['base_path']."assets/plugins/cacheaccelerator/"; // CacheAccelerator

$path_to_cache=$modx->config['base_path']."assets/plugins/cacheaccelerator/cache/"; // ( , CacheAccelerator)

require_once ($path_to_cacheengine."fileCache.php");// fileCache

$cache = fileCache::GetInstance(84600*7,$path_to_cache);// fileCache

$cache->deleteCache(0);//

return;








चेतावनी! हमने प्लगइन की सामग्री को कॉपी करने के बाद, सिस्टम ईवेंट्स टैब पर जाएँ, जिसमें हम कैश सर्विस इवेंट्स सेक्शन में OnCacheUpdate ईवेंट को बंद कर देते हैं!

इसके बाद सेव बटन पर क्लिक करें।

छवि

छवि

यह है, CacheAccelerator की स्थापना पूर्ण है।



यह प्लगइन एक फंक्शन करता है। जब MODx अपने कैश को फ्लश करता है, तो यह CacheAccelerator कैश को भी फ्लश करता है



CacheAccelerator का उपयोग करना:


CacheAccelerator का उपयोग किसी भी स्निपेट के लिए बिल्कुल किया जा सकता है। किसी भी आउटपुट कैश करें।

इस बीच, मैं Ditto और Jot को कॉल के उदाहरणों पर इसके उपयोग पर विचार करूंगा।



एक Ditto कॉल इस तरह दिखेगा:

[[CacheAccelerator?

&snippetToCache=`Ditto`

&cacheId=`News`

&parents=`1`

&display=`10`

&paginate=`1`

&paginateAlwaysShowLinks=`1`

]]








डिटो को स्वयं कॉल करने के बजाय, कैशेएक्लेरेटर स्निपेट कहा जाता है, और कैश्ड स्निपेट (इस मामले में, डिट्टो) का नाम स्निपेटोचेचे पैरामीटर में निर्दिष्ट किया गया है।

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

ध्यान दें कि यदि डिट्टो को डबल ब्रैकेट [[]] में बुलाया गया था, तो यह कॉल भी उनमें निहित होना चाहिए।



उदाहरण जोत कॉल:

[!CacheAccelerator?

&snippetToCache=`Jot`

&cacheId=`Comments`

&dropCacheField=`JotForm||post;true;2||;publish;2||;unpublish;2||;delete;2||;edit;2`

&noCacheGroups=`Site Admins`

&customfields=`name,email`

&pagination=`10`

&badwords=`*****`

&canmoderate=`Site Admins`

&captcha=`1`

!]








कैश्ड स्निपेट स्वयं स्निपेटटॉच पैरामीटर में भी निर्दिष्ट है, और कैशआईड में, पृष्ठ पर कैश्ड सामग्री की पहचानकर्ता।

दो और पैरामीटर dropCacheField और noCacheGroups हैं। हम और अधिक विस्तार से उन पर ध्यान केन्द्रित करेंगे।



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

इन उद्देश्यों के लिए, DropCacheField पैरामीटर भी कार्य करता है।

इसमें अलग की गई शर्तों की सूची है || जब इनमें से कोई भी स्थिति चालू हो जाती है, तो CacheAccelerator कैश साफ़ कर दिया जाता है।



स्थिति फ़ील्ड नाम हो सकती है।

GET या POST अनुरोधों में से किसका पता लगाने पर, कैश अपडेट किया जाएगा।



एक तुलना हो सकती है।

अर्धविराम सूचीबद्ध हैं:

;;_





यदि फ़ील्ड नाम को स्वयं रिक्त के रूप में इंगित किया गया है, तो सभी मौजूदा फ़ील्ड की तुलना की जाती है।



यहाँ एक उदाहरण है:

&dropCacheField=`JotForm||post;true;2||;delete;2`







यह यहाँ इंगित किया गया है:



किसी भी संयोग से, कैश साफ़ हो जाएगा।



Jot में एक नया संदेश पोस्ट करते समय, फॉर्म सबमिट किया जाता है, जिसमें JotForm फ़ील्ड होती है। इस प्रकार, एक टिप्पणी पोस्ट करने के बाद, कैश साफ़ हो जाएगा और जानकारी प्रासंगिक रहेगी। इस पृष्ठ के पहले अनुरोध के बाद, कैश फिर से बनाया जाएगा और बाद में कैश से कॉल दिया जाएगा।



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

डिफ़ॉल्ट रूप से भी, कैश प्रोसेसिंग उन उपयोगकर्ताओं के लिए नहीं होती है जो MODx प्रबंधक में अधिकृत हैं। और, यदि उपयोगकर्ता जिसके तहत आप सामग्री संपादित कर रहे हैं, वह व्यवस्थापक पैनल का सदस्य है, तो यह समस्या अपने आप ही गायब हो जाती है।



आप CacheAccelerator कैश को कॉल करके कहीं से भी साफ़ कर सकते हैं:

चंक से:

[!CacheAccelerator? &clearCache=`1`!]







स्निपेट से:

$modx->runSnippet("CacheAccelerator", array("clearCache" => 1))







कैशेबल स्निपेट द्वारा परिभाषित किसी भी प्लेसहोल्डर को कैश से कॉल करने पर भी कैश और रजिस्टर किया जाता है।



एक उदाहरण:

[[CacheAccelerator?&snippetToCache=`Ditto`&cacheId=`News`]]

[+start+] - [+stop+] [+total+] <br>

[+previous+] [+pages+] [+next+]<br>








पैरामीटर सूची:

snippetToCache - कैशिंग के लिए स्निपेट नाम, उदाहरण के लिए `डिट्टो`।

cacheId - पृष्ठ पर कैश्ड स्निपेट की पहचानकर्ता, उदाहरण के लिए, `समाचार`

dropCacheField - उनके लिए फ़ील्ड और शर्तों की एक सूची, जिसके कारण कैश रीसेट हो जाएगा, उदाहरण के लिए,'ototorm '- पोस्ट; सही; 2`

noCacheGroups - समूहों की एक सूची जिसके लिए कैश प्रसंस्करण नहीं किया जाएगा, उदाहरण के लिए, `व्यवस्थापक || मध्यस्थ ||

ClearCache - 1 के मान के साथ, कैश को साफ़ करने के लिए मजबूर किया जाता है।

logMessages - स्निपेट की सामग्री से पहले 1 के मूल्य के साथ, सिस्टम संदेश कैश में होने के बारे में और इसी तरह प्रदर्शित किया जाएगा।



शर्तों की सूची:

1 = = नहीं के बराबर

2 = बराबर

3 <से कम

4 > अधिक से अधिक

5 <= से कम या बराबर

6 > = से अधिक या उसके बराबर

7 शामिल हैं

8 शामिल नहीं है



आप इस साइट पर CacheAccelerator का तैयार संस्करण डाउनलोड कर सकते हैं।



किसी भी मामले में मैं तैयार उत्पाद और उसके काम में त्रुटियों की अनुपस्थिति का नाटक नहीं करता। यह बहुत पहला अल्फा संस्करण है, और मुझे ऐसे मैनुअल लिखने का बहुत कम अनुभव है।

मुझे दोषों और त्रुटियों के विकास और उन्मूलन में किसी भी मदद की खुशी होगी।



यूपीडी



नए स्निपेट विकल्प जोड़े गए:

noCacheRoles - प्रबंधक भूमिकाओं की एक सूची जिसके लिए कैश प्रसंस्करण नहीं किया जाएगा

उदाहरण के लिए `प्रशासक || संपादक`



checkURL - विभिन्न URL (1 | 0) के लिए एक अलग कैश बनाएं। डिफ़ॉल्ट रूप से सक्षम। शामिल पृष्ठ नेविगेशन स्निपेट्स के लिए उपयोगी है।



और प्लगइन के लिए एक नया पैरामीटर भी:

only_manual - कैश के केवल मैनुअल रीसेट की अनुमति दें।



संशोधन एंडचिर के लिए बहुत बहुत धन्यवाद!



आप अभी भी यहाँ या यहाँ से नया संस्करण डाउनलोड कर सकते हैं।



All Articles