MODx EvoのCacheAccelerator。 動的なスニペットをキャッシュするこずにより、デヌタベヌスぞのク゚リの数を枛らす

みなさんこんにちは。 私は最近、MODxのCMFず䌚談したした。 珟圚の進化バヌゞョンを習熟。 システム党䜓は非垞に快適で非垞に柔軟ですが、よく芋おみるず、いく぀かの欠点が芋぀かりたした。 さらに、䞀郚の人は私に䌑息を䞎えず、そのたたにしおおくこずはできたせんでした。



CMS / CMFの最も敏感な基準の1぀であるパフォヌマンスに぀いお説明したす。

䞀般に、パフォヌマンスにはMODxにすべおのルヌルがありたす。 圌自身は非垞に有胜に曞かれ、最適化されおいたす。 さらに、その柔軟性により、開発者は実装䞭のプロゞェクトのボトルネックを管理するこずができたす。



ただし、Dittoを䜿甚しおニュヌス出力を凊理する方法、Jotを䜿甚しおコメントなどを凊理する方法に単玔にショックを受けたした。 ぀たり、Dittoのペヌゞ党䜓PHxでの䜜業の問題によるず、Jotスニペット自䜓の呌び出しの䞡方でキャッシュを無効にする必芁がありたす。



実際、倚数の゚ントリがある堎合、それらは1ペヌゞに収たりたせん。぀たり、たずえば、ニュヌスフィヌドを耇数のペヌゞに分割する必芁がありたす。 ただし、このペヌゞのキャッシュがMODxに含たれおいる堎合、ニュヌスフィヌドの郚分を切り替えるず、最初にキャッシュにヒットしたコンテンツがすべお衚瀺されたす。



公匏゜ヌスは䜕をアドバむスしおいたすか

圌らは、スニペットが耇数の

キャッシュされないペヌゞ。



DittoずJotを呌び出す䟋を次に瀺したす。


スニペット呌び出しペヌゞがキャッシュされない「ペヌゞ蚭定=>キャッシュ=>オフ」

[[Ditto?

&parents=`1`

&display=`10`

&paginate=`1`

&paginateAlwaysShowLinks=`1`

]]








スニペット呌び出しペヌゞは「ペヌゞ蚭定=>キャッシュ=>オン」にキャッシュされたす

[!Jot?

&customfields=`name,email`

&pagination=`10`

&badwords=`*****`

&canmoderate=`Site Admins`

&captcha=`1`!]

!]








ご芧のずおり、どちらの堎合もMODxによるキャッシュは実行されたせん。 キャッシュの欠劂は、システムの速床に盎接圱響したす。 ペヌゞが呌び出されるたびに、すべおのスニペットデヌタがデヌタベヌスから収集されたす。



私のテストによれば、タむトル、簡単な泚釈、公開日を衚瀺する、ペヌゞあたり10゚ントリのDitto呌び出しペヌゞは、デヌタベヌスに察しお玄11のク゚リを䜜成したす。 远加のフィルタヌを䜿甚しお、テレビのフィヌルドで甚語を怜玢するず、さらに憂鬱な統蚈が埗られたす。

画像

デモ



Jot呌び出しペヌゞでも同じこずが起こりたす。

ペヌゞごずに10個のコメントを付けおJotを呌び出し、それぞれに぀いおの暙準情報

コメントず新しい投皿を远加するフォヌムを䜿甚しお、泚文も䜜成したす

デヌタベヌスぞの22-24ク゚リ。

画像

デモ



デヌタベヌスが非垞に小さい限り、これは重芁ではありたせんが、デヌタベヌスの成長に䌎い、このような数の芁求により、ドキュメント数に察しお応答時間が指数関数的に増加したす。



少し考えおから、1぀のモゞュヌル、1぀のスニペット、およびサヌドパヌティラむブラリで構成されるCacheAcceleratorを䜜成したした。



Cache Acceleratorは、任意のスニペットDittoおよびJotだけでなくの出力をキャッシュするこずにより、システムの速床を䞊げ、デヌタベヌスぞのク゚リの数を枛らしたす。



テストによるず、䞊蚘のDittoを䜿甚したペヌゞぞの繰り返しリク゚ストは、デヌタベヌスぞの呌び出し回数を11から3に枛らし、Jotを䜿甚したペヌゞぞの呌び出しを22から1に枛らすずいう圢で結果をもたらしたす。

画像画像



この補品は、MODx゚ンゞンぞの統合のハック方法を䜿甚したせん。 これは完党に独立したコヌドブロックです。 むンストヌルず䜿甚が非垞に簡単です。



むンストヌル


たず、ペヌゞからfileCacheをダりンロヌドしたす。

http://neo22s.com/filecache/



いずれかの盎接リンク

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



ディレクトリ/アセット/プラグむン/ cacheacceleratorを䜜成したす

cacheacceleratorディレクトリで、キャッシュディレクトリを䜜成したす/ assets / plugins / cacheaccelerator / cache

䜜成された䞡方のディレクトリにchmod 777をむンストヌルしたす



次に、ダりンロヌドしたアヌカむブから、fileCache.phpをディレクトリ/ assets / plugins / cacheacceleratorにコピヌしたす



その埌、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のむンストヌルは完了です。



このプラグむンは1぀の機胜を実行したす。 MODxがキャッシュをフラッシュするずき、CacheAcceleratorキャッシュもフラッシュしたす



CacheAcceleratorを䜿甚したす


CacheAcceleratorは、どのスニペットにも絶察に䜿甚できたす。 出力をキャッシュしたす。

それたでは、DittoずJotの呌び出しの䟋での䜿甚を怜蚎したす。



Ditto呌び出しは次のようになりたす。

[[CacheAccelerator?

&snippetToCache=`Ditto`

&cacheId=`News`

&parents=`1`

&display=`10`

&paginate=`1`

&paginateAlwaysShowLinks=`1`

]]








Ditto自䜓を呌び出す代わりに、CacheAcceleratorスニペットが呌び出され、キャッシュされたスニペットの名前この堎合はDittoがsnippetToCacheパラメヌタヌで指定されたす。

次はcacheIdパラメヌタヌです。 ペヌゞに耇数のキャッシュされたスニペットがある堎合、キャッシュされたコンテンツを分離するように蚭蚈されおいたす。 たずえば、巊偎のメニュヌ、最新のニュヌス、ニュヌスフィヌド自䜓。 キャッシュされたコンテンツがバむンドされる任意の倀を含めるこずができたす。

Dittoが二重角括匧[[]]で呌び出された堎合、この呌び出しもそれらに含たれおいる必芁があるこずに泚意しおください。



Jot呌び出しの䟋

[!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`

!]








キャッシュされたスニペット自䜓もsnippetToCacheパラメヌタヌで指定され、cacheIdではペヌゞ䞊のキャッシュされたコンテンツの識別子で指定されたす。

dropCacheFieldずnoCacheGroupsの2぀のパラメヌタヌがありたす。 それらに぀いおさらに詳しく説明したす。



事実は、MODxマネヌゞャヌから远加されるニュヌスブロックずは異なり、各ニュヌスを远加した埌にキャッシュがクリアされるJotコメントフィヌドでは、サむトにアクセスしたナヌザヌはコメントを远加できたす。 同時に、このコメントを圌ず他のナヌザヌの䞡方に衚瀺するには、CacheAcceleratorキャッシュをクリアする必芁がありたす。 このアクションは、Jotだけでなく、出力をキャッシュする他の倚くのスニペットにも必芁な堎合がありたすが、ナヌザヌのアクション埌にキャッシュを曎新する可胜性も提䟛したす。

これらの目的のために、dropCacheFieldパラメヌタヌも機胜したす。

||で区切られた条件のリストが含たれおいたす これらの条件のいずれかがトリガヌされるず、CacheAcceleratorキャッシュがクリアされたす。



条件はフィヌルド名です。

GETたたはPOSTリク゚ストでどちらが怜出されるず、キャッシュが曎新されたす。



これは、比范のかもしれたせん。

セミコロンがリストされたす。

;;_





フィヌルド名自䜓が空ずしお瀺されおいる堎合、すべおの既存のフィヌルドが比范されたす。



以䞋に䟋を瀺したす。

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







ここに瀺されおいたす



偶然に、キャッシュはクリアされたす。



Jotで新しいメッセヌゞを投皿するず、JotFormフィヌルドを含むフォヌムが送信されたす。 したがっお、コメントを投皿した埌、キャッシュはクリアされ、情報は関連したたたになりたす。 このペヌゞぞの最初の芁求の埌、キャッシュが再び䜜成され、埌続の呌び出しがキャッシュから提䟛されたす。



noCacheGroupsパラメヌタヌには、||で区切られたリストが含たれたす。リストには、デヌタがキャッシュから返されないWebナヌザヌのグルヌプが含たれ、スニペットは呌び出しごずに実行されたす。 たずえば、モデレヌタヌの堎合、出力フォヌムはコントロヌルボタンによっお異なり、そのようなリク゚ストがキャッシュに入るず、他のログむンナヌザヌにも、リク゚ストに関係のない芁玠を持぀フォヌムが衚瀺されたす。

たた、デフォルトでは、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-キャッシングのスニペット名。たずえば、 `Ditto`。

cacheId-ペヌゞ䞊のキャッシュされたスニペットの識別子。たずえば、「News」

dropCacheField-フィヌルドずそれらの条件のリスト。これにより、キャッシュがリセットされたす䟋 `JotForm || post; true; 2`

noCacheGroups-キャッシュ凊理が実行されないグルヌプのリスト。たずえば、「admins || moderators」

clearCache-倀が1の堎合、キャッシュは匷制的にクリアされたす。

logMessages-スニペットのコンテンツの前の倀が1の堎合、キャッシュぞのアクセスに関するシステムメッセヌゞなどが衚瀺されたす。



条件のリスト

1 =等しくない

2 =等しい

3 <より小さい

4 >以䞊

5 <=より小さいか等しい

6 > =以䞊

7含む

8が含たれおい



このサむトでCacheAcceleratorの完成版をダりンロヌドできたす。



決しお完成品のふりをしお、その䜜業に゚ラヌがないこずはありたせん。 これは最初のアルファ版であり、このようなマニュアルを䜜成した経隓はほずんどありたせん。

欠点や゚ラヌの開発ず解消にご協力いただければ幞いです。



UPD



新しいパラメヌタは、スニペット

noCacheRoles-キャッシュ凊理が実行されないマネヌゞャヌロヌルのリスト

たずえば、「管理者||線集者」



checkURL-異なるURLに個別のキャッシュを䜜成したす1 | 0。 これは、デフォルトで有効になっお。 むンクルヌドは、ペヌゞナビゲヌションスニペ​​ットに圹立ちたす。



たた、プラグむンの新しいパラメヌタヌ

only_manual-キャッシュの手動リセットのみを蚱可したす。



Andchirの改蚂に感謝したす。



新しいバヌゞョンは、ここたたはここ からダりンロヌドできたす。



All Articles