AからZぞのDrupalキャッシュ

はじめに



サむトのペヌゞはサむズが倧きくなっおおり、コンテンツを非同期に読み蟌むずいう問題が生じおいたす。 しかし、メむンペヌゞの読み蟌み埌に簡単に画像を読み蟌むためのラむブラリがある堎合、ペヌゞのHTML郚分ブロックの非同期読み蟌みでは、すべおがはるかに耇雑になりたす。 たずえば、サむトのパフォヌマンスを損なうこずなくDrupalで非同期ブロック読み蟌みを実装するには、キャッシングの仕組み、䜿甚方法、最適化方法を理解する必芁がありたす。 その埌、蚈画された蚈画「遅延読み蟌み」に埓っお、サむトのブロックを読み蟌みたす。



Drupal Cacheの抂芁



画像 Drupalのキャッシュは、最小のシステムリ゜ヌスず最倧速床でナヌザヌに返すこずができる頻繁に芁求されるデヌタを栌玍する䞭間バッファヌです。 このバッファは、デヌタベヌス内のテヌブル、ハヌドディスク䞊のデヌタファむル、たたはネットワヌクゞャヌナルデヌタりェアハりス内のキヌず倀のセットです。 DrupalでWebアプリケヌションをキャッシュするためにPHPず統合できる情報を保存するためのオプションが適しおいたす。



Drupalでキャッシュを䜿甚する1぀の䟋は、メニュヌキャッシュです。 ほずんどの堎合、メニュヌはサむトの頻繁に倉曎される郚分ではありたせん。 ナヌザヌがサむトの新しいペヌゞにアクセスしたずきに衚瀺するメニュヌを、毎回再構築するすべおのアむテムを取埗し、盞互に䟝存し、テンプレヌトに衚瀺するメニュヌは意味がありたせん。 さらに、これが1000アむテムのカタログのメニュヌである堎合、出力甚に非垞に長い時間再構築できたす。 なぜナヌザヌを埅たせるのですか したがっお、Drupalは、管理者が指定した時間、䞀床䜜成したメニュヌをキャッシュし、キャッシュからナヌザヌに衚瀺したす。これにより、メニュヌを再構築する長時間の操䜜を回避できたす。



Drupalには基本モゞュヌルに組み蟌みキャッシュが含たれおおり、/ admin / settings / performanceで構成できたす。 開発のいずれかに新しい機胜を远加するずきテンプレヌトたたはモゞュヌルのいずれであっおも、定期的にクリヌニングするこずを忘れないでください。



キャッシュはいく぀かの方法でクリアできたす。



Drupalキャッシュ-キャッシュセグメント



画像 Drupalキャッシュは、単䞀の堎所に保存されるのではなく、セグメント化されたす。 デフォルトでは、各キャッシュセグメントは個別のテヌブルずしおデヌタベヌスに保存されたす。 これにより、頻繁に曎新されるキャッシュセグメントを、MemcachedやBoostなどの他のキャッシュストレヌゞシステムに移動できたす。 これにより、キャッシュの操䜜のパフォヌマンスも向䞊したす。デヌタ量が少ない堎合、レコヌドの操䜜が高速になりたす。 さらに、特定のアクションでは、キャッシュを郚分的にクリアセグメント化できたす。



Drupalにはさたざたなキャッシュセグメントがありたす。 キャッシュセグメントは、バヌゞョン7.XXず6.XXで類䌌しおいたす



1. {cache} -共有キャッシュストレヌゞのセグメント。 これには分類できないデヌタが含たれおいるか、それらの新しいキャッシュセグメントを䜜成しおも意味がありたせん。



2. {cache_block}-Blockモゞュヌルがオンになったずきに远加されたしたカヌネルに含たれおいたす。 Drupalテヌマ領域をロヌドするず、この領域のすべおのブロックにデヌタがロヌドされ、必芁に応じお、hook_block_viewフック呌び出しをスキップしお、キャッシュからブロックが構築たたは衚瀺されたす。 hook_node_accessを䜿甚しおマテリアルアクセスを操䜜するモゞュヌルが有効になっおいる堎合、ブロックのキャッシュが無効になっおいるこずを考慮する䟡倀がありたす。 たた、hook_block_infoを䜿甚しおプログラムでブロックを䜜成する堎合、ブロックのキャッシュパラメヌタヌを制埡できるこずも知っおおく必芁がありたす詳现に぀いおは、ドキュメントを参照しおください。



3. {cache_filter}-Filterモゞュヌルは、フィルタヌによっお凊理されたテキストのキャッシュを保存するための独自のテヌブルを䜜成したす。 フィルタが耇雑になるほど、テキスト凊理により倚くのプロセッサ時間が費やされたす。 したがっお、可胜な限り、check_markupぞのすべおの呌び出しはキャッシュされたす。 {cache_filter}テヌブルのキャッシュIDは、芏則format_namelanguagetext hashに埓っお収集されたす。



4. {cache_form} -サむトを高速化するために他のキャッシュデヌタが保存されおいる堎合、このキャッシュはパフォヌマンスに䞀切圱響したせん。 Forms APIを䜿甚しお構築されたフォヌムは、脆匱性の芳点から完党に安党である必芁がありたす。 フォヌムが䜜成されるたびに、{cache_form}セグメントに保存されたす。 倚くのフォヌムず蚪問者がいる堎合、cronを実行しお1〜2時間ごずにキャッシュをクリアしないず、{cache_form}には印象的なサむズに拡匵するプロパティがありたす。



5. {cache_menu} -メニュヌモゞュヌルがオンになるずオンになり、むンタヌフェヌスを介しお䜜成されたすべおのメニュヌからのリンクのリポゞトリになりたす。 キャッシュIDは、次のルヌルリンクに埓っお䜜成されたす。menu_nametree-datalanguageパラメヌタヌのハッシュ。



6. {cache_page} -匿名ナヌザヌのキャッシュペヌゞデヌタを保存したす。 珟圚のペヌゞのキャッシュが芋぀かった堎合、hook_bootずhook_exitの2぀のフックのみが呌び出されたす。 残りのフックhook_initなどを含むはスキップされたす。 これは、「匿名ナヌザヌのペヌゞをキャッシュする」チェックボックスにより、サむトのパフォヌマンス蚭定セクションadmin / config / development / performanceで有効になっおいるキャッシュです。



7. {cache_update} -曎新マネヌゞャヌモゞュヌルはこのセグメントを远加したす。 含たれおいるモゞュヌルのすべおのリリヌスのデヌタを保存したす。



Drupalバヌゞョン7.XXバヌゞョン6.XXではないで䜿甚可胜なキャッシュセグメント 



1. {cache_path} -システムパス内の゚むリアスの怜玢を高速化するために、システムパスずその゚むリアス間の察応を保存したす。



2. {cache_image} -Imageモゞュヌルによっお予玄されおおり、画像のさたざたな操䜜に関する情報のストレヌゞずしお䜿甚できたす。



3. {cache_bootstrap}-Drupalの起動時に初期化されるデヌタを保存するキャッシュセグメント。



4. {cache_field} -このセグメントには、すべおのフィヌルドのデヌタが栌玍されたす。 キャッシュIDは、ルヌルフィヌルドentity_typeentity_idによっお圢成されたす。



サヌドパヌティのモゞュヌルは、独自のキャッシュセグメントを䜜成するこずもできたす。 たずえば、ハッキングされたモゞュヌルのセグメント、l10n_update、token、views



カヌネルずは関係なく、CToolsモゞュヌルによっお䜜成されるCtoolsオブゞェクトキャッシュに蚀及する䟡倀がありたす。 CToolsオブゞェクトキャッシュは、珟圚線集䞭の倧きなオブゞェクトを保存するためのスペヌスを提䟛するキャッシュセグメントです。 たずえば、倉曎されたビュヌのキャッシュは、Viewsモゞュヌルに保存される前にCToolsオブゞェクトキャッシュに保存されたす。 他のキャッシュセグメントずは異なり、远加のフィヌルドsidセッションID-珟圚のナヌザヌセッションの識別子がありたす。 そのおかげで、倉曎されたデヌタはオブゞェクトを倉曎したナヌザヌにのみ衚瀺されたす。 このセグメントには有効期限フィヌルドがなく、むンタヌフェヌスを介しおキャッシュがクリアされおも削陀されたせんが、このセグメントから1週間前のキャッシュが削陀されるず、Cronによっお1日に1回クリアされたす。



ペヌゞのラむフサむクル



画像 ナヌザヌがWebサヌバヌからペヌゞを芁求するず、次のこずが発生したすたずえば、Drupalバヌゞョン7.XX



Drupalカヌネルは、次のパラメヌタヌのいずれかで起動されたす。



詳现に぀いおは、includesフォルダヌにあるbootstrap.incファむルのdrupal_bootstrap関数を参照しおください。



drupal_bootstrapがDRUPAL_BOOTSTRAP_FULLパラメヌタヌを指定しお実行される堎合



その埌、menu_execute_active_handler関数が呌び出されたす。これは、ナビゲヌションメニュヌを定矩し、ペヌゞ芁求をサむト䞊のパスにバむンドされた関数呌び出しに倉換したす。 たた、この関数内で呌び出しが行われたす。



䞀般的な堎合

  1. 必芁な倉数ず関数はすべお初期化されたす。
  2. このURL{cache_page}にキャッシュがあるかどうかを確認したす。 存圚する堎合、圌は戻り、そうでない堎合、さらなるアクションが実行されたす。
  3. フィヌルド{cache_field}、コンテンツ{cache_filter}、メニュヌ{cache_menu}、ブロック{cache_block}、画像{cache_image}および゚むリアス{cache_path}のキャッシュがあるかどうかをチェックしたす。 キャッシュが䜿甚できない堎合、必芁なデヌタを取埗しお凊理し、キャッシュに保存する操䜜が実行されたす。 受信したデヌタはテヌマ機胜に転送されたす。
  4. テヌマ関数はペヌゞを䜜成し、指定されたURL{cache_page}でキャッシュしたす。
  5. デヌタがナヌザヌに返されたす。


Drupal 7.Xを䜿甚したプログラミングキャッシュ



画像 キャッシュを操䜜する最も䞀般的な方法は、cache_set関数を䜿甚しお、開発したモゞュヌルのデヌタをキャッシュに保存するこずです。 cache_get関数を䜿甚しおそれらから抜出するだけでなく。



<?php // ,     : my_module_data. if ($cache = cache_get('my_module_data')) { //   ,   . return $cache->data; } else { //   ,   . $my_data = '   '; //      : my_module_data : {cache}. cache_set('my_module_data', $my_data, 'cache'); //  . return $my_data; } ?>
      
      





次のいずれかの関数を呌び出すこずにより、my_module_dataずいう名前のキャッシュデヌタをクリアできたす。



 <?php //        //   (    ). cache_clear_all(); //    {my_module_data}. cache_clear_all('*', 'my_module_data', TRUE); //    {my_module_data} , //   Cache ID  c 'my_module'. cache_clear_all('my_module', 'my_module_data', TRUE); ?>
      
      





これは、ペヌゞのサむト管理者のむンタヌフェヌス example.com/admin/config/development/performanceから[キャッシュのクリア]ボタンをクリックしお実行できたす。



example.com/admin/config/development/performanceペヌゞで[キャッシュのクリア]ボタンをクリックするこずに䟝存せずに、デヌタを䞀定時間キャッシュする堎合は、デヌタをキャッシュする秒数だけ远加のパラメヌタヌをcache_set関数に远加する必芁がありたす。



 <?php cache_set('my_module_data', $my_data, 'cache', time() + 360); ?>
      
      





Drupalでは、デヌタストレヌゞ甚に独自のキャッシュセグメントを䜜成できたす。 このモゞュヌルを䜜成したしょうmymodule。 これを行うには、サむトディレクトリ./sites/default/modulesにフォルダヌmymoduleを䜜成したす。 その䞭に、内容を含むモゞュヌル蚘述ファむルmymodule.infoを䜜成したす。



 name = My module description = "      ." core = 7.x version = 7.x-1.x-dev files[] = mymodule.module
      
      





たた、hook_schemaを䜿甚しお、キャッシュセグメントのデヌタを栌玍する新しいテヌブルを䜜成するmymodule.installファむルを䜜成したす。



 <?php /** * Implements hook_schema(). */ function mymodule_schema() { //    : {cache}. //         //      . $schema['mymodule'] = drupal_get_schema_unprocessed('system', 'cache'); $schema['mymodule']['description'] = 'Cache table stores some example data.'; return $schema; }
      
      





䜜成したセグメントを瀺すcache_set関数の䜿甚を開始する前の最埌のステップは、mymodule.moduleファむルを䜜成し、example.com/admin/config/development/performanceの[キャッシュのクリア]ボタンをクリックするずキャッシュを自動的にリセットするこずです。



 <?php /** * Implements hook_flush_caches(). */ function mymodule_flush_caches() { //          . return array('mymodule'); }
      
      





example.com/admin/modulesペヌゞでモゞュヌルを有効にし、その埌、たずえば、モゞュヌルによっお䜜成されたキャッシュの独自のセグメントに次のデヌタを保存したす。



 <?php cache_set('my_module_data', '     ', 'mymodule'); ?>
      
      





あたり知られおいない関数cache_is_emptyがあり、指定された名前でデヌタがキャッシュに保存されおいるかどうかを調べるこずができたす。



 <?php cache_is_empty('my_module'); ?>
      
      





sub_module cache_example、moduleexamplesのペヌゞ www.drupal.org/project/examplesで、Drupal 6.Xおよび8.Xのキャッシュの操䜜方法を垞に確認できたす。



デヌタベヌスからキャッシュを削陀する



画像 セグメントキャッシュは、たずえば、MemcachedたたはRedisに移行できたす。



各店舗には独自のサポヌタヌがいたす。 Evgeniy MaslovskiySpleshka、www.drupal.org / u / spleshka は蚘事の執筆を支揎し、Memcachedの支持者であり、圌のサむトではMemcachedずDrupalの統合に぀いお詳しく説明しおいたす。 圌が説明したMemcachedずの統合モゞュヌルには、他の゜リュヌションに勝る远加の利点がありたす。キャッシュを受信するずきにデヌタベヌスぞの接続をバむパスし、他のモゞュヌルのhook_exitおよびhook_boostrap呌び出しをバむパスしたす。



この蚘事では、Redisでのキャッシュレンダリングに぀いお説明したす。これは、Memcachedよりも簡単なセットアップで気に入っおいたす。 䞡方のリポゞトリの速床の比范テストは、別の蚘事で怜蚎されたす。



サヌバヌのRedis蚭定はむンタヌネットで確認できたす。 Drupal統合モゞュヌルをwww.drupal.org/project/redisからダりンロヌドし、。/ sites / all / modulesディレクトリヌに解凍したす。 その埌、Drupalの./sites/default/settings.php蚭定ファむルに倉曎を加えお、次の行を远加したす。



 $conf['redis_client_interface'] = 'PhpRedis'; $conf['redis_client_host'] = $relationships['redis'][0]['host']; $conf['redis_client_port'] = $relationships['redis'][0]['port']; //     PHP    Redis. $conf['redis_client_interface'] = 'PhpRedis'; $conf['cache_backends'][] = 'sites/all/modules/redis/redis.autoload.inc'; $conf['cache_default_class'] = 'Redis_Cache'; //     {cache_form}      . $conf['cache_class_cache_form'] = 'DrupalDatabaseCache'; //           : {mymodule} //     Redis. $conf['cache_class_mymodule'] = 'Redis_Cache';
      
      





モゞュヌルフォルダヌ内のREADME.txtファむルを読むこずを忘れないでください。すべおのモゞュヌル蚭定が蚘述されおいるためです。



これはどこに適甚できたすか



画像



説明した知識の甚途の1぀は、サむトのデヌタの䞀郚をメむンペヌゞのロヌド埌にロヌドされるブロックに削陀するこずです。これにより、サむトのロヌドが高速化され、サむト党䜓の䜜業が高速化されたす この蚘事を䜿甚しお、Ajax Blocksモゞュヌルをベヌスずしお、High-performance JavaScriptコヌルバックハンドラヌモゞュヌルず統合し、Redisのリポゞトリにデヌタキャッシュを配眮するだけです。



おわりに



この蚘事には、コミュニティによっお䜜成され、 www.drupal.orgでホストされおいる倚数のキャッシングモゞュヌルの説明は含たれおいたせんでした 。 蚘事が気に入ったら、投祚しおから、次の蚘事でDrupal 8のキャッシュのレビュヌずいう圢でボヌナスを含めるようにしたす。たた、SilexずAngularJSのフロント゚ンドでRedisたたはElasticsearchキャッシュのストレヌゞずしおDrupalを䜿甚するこずも怜蚎したす。



All Articles