トランジェントAPIとは何ですか?

公開: 2020-12-16

Webサイトのパフォーマンスは、多くの場合、キャッシュの概念を中心に展開されます。つまり、データを準備ができてアクセスが速い状態で保存し、ブラウザーでより迅速に再現できるようにします。 WordPress Transients APIはキャッシュ用のツールであり、WordPressWebサイトのパフォーマンスを向上させる強力な方法です。

キャッシングとは何ですか?なぜそれを使用するのですか?

ブラウザがWebページを要求するたびに、サービングサーバーは多くの複雑で時間のかかる計算を実行する必要があり、これが遅延につながります。 クエリを実行した後、キャッシュテクノロジーのおかげで、サーバーは最終結果を記憶し、2回目の要求時に、同じ計算を再度実行することなくブラウザーに提供できます。 したがって、以前のリソースをキャッシュして再利用する機能は、パフォーマンスを最適化するために重要です。

非常に単純なキャッシングは、情報をキャッシングレイヤーに一時的に保存するオプションを提供します。

キャッシングの種類は何ですか?

キャッシュにはさまざまな種類があり、それらを組み合わせて使用​​することで、より高いレベルのパフォーマンスを実現できます。

キャッシュの種類

ブラウザのキャッシュ

Webページのコンテンツを開く前に、ブラウザにはJavaScriptファイル、スタイルシート、フォントなどの多くのものが必要です。これらはすべて、ページのコンテンツに加えてダウンロードされます。

ブラウザがこれらのファイルをキャッシュしている場合、Webサイトをロードするたびにファイルをダウンロードする必要はありません。 初めてサイトをロードするのは通常数秒かかりますが、ブラウザがそれらのファイルをキャッシュした後、ロード時間は大幅に短縮されます。

サーバーキャッシング

サーバーキャッシュとは、特定のページのHTMLファイルを保存し、後続の各リクエストに使用することを意味します。 これは、いわゆるフルページキャッシュです。

別の種類のサーバーキャッシュがあります。オブジェクトキャッシュは、フルページキャッシュとは異なり、特定のビット(断片)の情報のみをキャッシュします。

ページキャッシング

最も効果的なキャッシュと見なされます。 その名前は、それが機能する方法を自明です。 ユーザー「A」がページにアクセスすると、Webサイトはそのページを作成し、そのコンテンツをユーザーのブラウザーに返します。 ページキャッシュを実行すると、このページコンテンツが保存されるため、ユーザー「B」が同じページにアクセスすると、ページキャッシュは以前に送信されたコンテンツを再現します。

ページキャッシュの最大の利点は、キャッシュされたページがアクセスのほぼ瞬間に戻ることです。 その結果、メモリ速度が最も低く、CPU使用率がほとんどない最も弱いサーバーでも、何百万もの要求が処理され、ページが複製されます。

ただし、このタイプのキャッシュには欠点もあります。たとえば、許可されたユーザーや、ページコンテンツが現在のユーザー変数に依存しているユーザーのページをキャッシュできないなどです。

データベースキャッシング

データベースキャッシングは、バックエンドデータベースにアクセスすることによってオンデマンドで(動的に)Webページを生成するコンピューターアプリケーションの設計に含まれるプロセスです。 データベースキャッシュは、通常は頻繁にアクセスされる読み取りデータの形で、プライマリデータベースへの不要なプレッシャーを取り除くことにより、プライマリデータベースを強化します。 キャッシュ自体は、データベース、アプリケーション、またはスタンドアロンレイヤーを含む多くの領域で動作できます。

これらのアプリケーションが、ブラウザーベースのクライアント、Webアプリケーションサーバー、およびバックエンドデータベースを含む多層環境に展開される場合、中間層データベースキャッシングを使用して、高いスケーラビリティとパフォーマンスを実現します。

オブジェクトキャッシング

WordPressのオブジェクトキャッシュ(オブジェクトキャッシュ)には、データベースクエリの保存が含まれます。 これは、任意のタイプのデータ(オブジェクト)を保存し、必要に応じて取得できるようにする組み込みのシステムメカニズムです。 このキャッシュは、複雑な操作の結果を保存するために使用されます。

WordPressサイトで有効にすると、PHPの実行時間が短縮され、サイトの訪問者にコンテンツがより速く配信され、データベースの負荷が軽減されます。

CDN(コンテンツ配信ネットワーク)

これは地理的に分散したネットワークインフラストラクチャであり、Webサービスやサイトのユーザーにコンテンツを迅速に配信します。 CDNに含まれるサーバーは、サイト/サービスのユーザーの応答時間を最小限に抑えるように地理的に配置されています。

WordPressのTransientsAPIとは何ですか?

Transients APIは、ブラウザのキャッシュではなく、情報のブロック(コードの文字列、HTMLコンテンツ、WP_Queryオブジェクト、JSON)をWebサイトのデータベースに保存する方法です。 TransientsAPIはOptionsAPIと非常に似ていますが、主な違いは、TransientsAPIには有効期限またはより適切な寿命があることです。

トランジェントの3つの主な操作は、値の設定、値の取得、および値の削除です

1.トランジェントを設定–

 set_transient($ key、$ value、$ expires);

トランジェントを設定するには、次の3つのコンポーネントを持つset_transient()関数を使用できます。

  • キー–トランジェントの短い一意の名前。 長さは172文字以下である必要があります。
  • –データベースに保存される情報を含む任意のタイプのPHP変数。
  • 有効期限(有効期間)–情報が保存される時間。

たとえば、リスト投稿クエリを1日保存する場合は、次のようにします。

 set_transient( 'unique_listing_posts_query_results_name'、$ Listing_posts_query_results、DAY_IN_SECONDS);

ご覧のとおり、WordPress 3.5で導入されたいくつかの時定数の1つ(DAY_IN_SECONDS)を使用して、時間を簡単に表現しています。 これは、すべての時定数の完全なリストです。

 MINUTE_IN_SECONDS = 60(秒)
HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS
DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS
WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS
MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS
YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS

2.トランジェントを取得–

 get_transient($ key);

保存されたトランジェントを取得するには、

 get_transient($ transient_name);

私たちの場合、クエリ結果を一覧表示する投稿を次のように取得できます。

 get_transient( 'unique_listing_posts_query_results_name' );

これについては、後の例のセクションで詳しく説明します。

3.トランジェントを削除します–

 delete_transient($ key);

前のサブセクションで説明したように、Transients APIを使用して、データベースへのリモートまたはローカル(データベースからのコンテンツまたはクエリ)応答を取得および保存できます。

ただし、古い保存コンテンツどのように削除するか(一時的)という問題が発生します。 トランジェントをクリア(削除)する方法は2つあります。

自動削除

トランジェントの優れた点は、有効期限(寿命)設定すると自動的に期限切れになることです。 有効期限が切れた後にデータベースからトランジェントを取得しようとすると、WordPressは自動的にデータベースを削除し、混乱を防ぎます。 誰かがウェブサイトを開くと、トランジェントが再作成されます。 このようにして、リモートまたはローカルAPIからの新鮮なコンテンツを確実に入手できます。

手動削除

トランジェントを手動で削除して、トランジェントを早期に強制終了する必要がある場合があります。 これは、特定のアクティビティ(新しいメニュー項目の追加、投稿の保存または更新、カテゴリの追加または更新など)によって、キャッシュされたデータが本質的に古くなり、更新が必要になる場合に役立ちます。

私たちが使わなければならない機能は

delete_transient($ transient_name)

私たちの場合は次のようになります。

 delete_transient( 'unique_listing_posts_query_results_name' );

注:再作成できない貴重なデータを保存するためにトランジェントを使用しないことが重要です!

トランジェントAPIを使用する必要があるのはなぜですか?

あまり頻繁に変更されず、キャッシュしたい計算集約型の値がある場合はいつでも、TransientsAPIを使用できます。 WordPressでは、これは通常、データベースクエリの結果のオブジェクトになりますが、実際には、スカラー値、配列、オブジェクトなど、変数に格納するものであれば何でもかまいません。

したがって、テーマやプラグインで複雑なクエリを実行する場合は、すべてのトランジェントが最適です。

リモートまたはローカル応答をキャッシュする利点

リモートAPI応答

リモートAPIは常にリモートサーバーに対して複数の呼び出しまたは要求を行い、追加の遅延が発生します。 これには時間がかかり、遅延が発生します。 また、一部のリモートAPIにはレート制限があります。つまり、特定の期間内に最大リクエスト制限に達することができます。

また、ご存知のとおり、Transients APIを利用して、リモートサーバーからの応答(結果)をキャッシュし、データベースに保存できます。 これで、

 get_transient();

メソッドを作成し、他のリモート呼び出しや要求を行わずに、必要に応じて保存された(キャッシュされた)結果/コンテンツを表示します。

これはすべて:

  • リモートHTTPS呼び出しと要求を減らす
  • CPUサーバーの使用量を減らす
  • ウェブサイトページの読み込み時間を改善する

ローカルAPI応答

–基本的に、データベースからのHTMLまたはクエリの結果。 Transients APIは、リモートレスポンスのキャッシュだけでなく、HTMLコンテンツやクエリ結果をローカルデータベースに保存するためにも使用できます。 Webサイトに繰り返し可能なHTMLセクション(ウィジェット、スライダー、メニューなど)を表示したい場合、または誰かがWebサイトにアクセスするたびに複雑または遅いデータベースクエリがトリガーされないようにする場合に非常に便利です。

トランジェントをいつどこで使用するか?

  • 複雑なカスタムデータベースクエリ
  • WordPressのナビゲーションメニュー
  • 次のような情報を表示するサイドバーウィジェット。 ツイート、最近のサイト訪問者のリスト、または特定のカテゴリからの投稿のリスト
  • タグクラウドのキャッシュ
  • 外部HTTPリクエストのキャッシュ

使用法と例

非常に多くの説明の後、実際の例の時間です。

基本的な使用法

関数get_my_data(){

$ data = get_transient( 'my_transient_name');
if(false === $ data){//トランジェントの有効期限が切れている/設定されていない

$ data = fetch_my_data(); //元のソースからデータをプルします

set_transient( 'my_transient_name'、$ data、HOUR_IN_SECONDS);

}

$ dataを返します。

}

fetch_my_data()関数は、WP_Queryオブジェクト、jsonデータ、htmlコンテンツなどを格納できます

基本例

すでに説明したように、このタイプのキャッシュは長い操作の結果を保存するのに適しています。最も簡単な例は、Facebookなどの外部APIにアクセスすることです。

Facebook APIにアクセスし、オブジェクト(より正確にはページ)your-website.urlを要求し、ページのいいねの数を返す次の関数があるとします。

 関数get_facebook_likes(){

$ result = wp_remote_get( 'https://graph.facebook.com/your-website.url');

$ result = json_decode(wp_remote_retrieve_body($ result));

$ result-> likesを返します。

}

echo "Facebookのいいね:"。 get_facebook_likes();

この関数の実行時間は、Facebookサーバーに対するサーバーの位置、ネットワークのステータス、速度など、多くの要因によって異なります。関数の平均所要時間は1〜3秒です。

これは、サイトでこの機能を使用すると、各ページの読み込み時間が1〜3秒長くなることを意味します。 さらに、この関数を500秒間に500回以上呼び出すと、Facebookは結果ではなくエラーを生成し始めます。

この機能を高速化するために、WordPress Transients APIを使用して、結果を1時間保存できます。

 関数get_facebook_likes(){
if(false ===($ likes = get_transient( 'fb_likes'))){
$ result = wp_remote_get( 'https://graph.facebook.com/your-website.url');
$ result = json_decode(wp_remote_retrieve_body($ result));
$ likes = $ result-> likes;

//トランジェントを1時間(秒単位)に設定します
set_transient( 'fb_likes'、$ likes、1 * HOUR_IN_SECONDS);
}

$ likesを返します。
}

したがって、この関数が初めて呼び出されたとき、Facebookからのリクエストを受信した後、WordPressは結果をデータベースに書き込み、将来的にはFacebookサーバーに繰り返しリクエストを行わずにデータベースからこの結果を1時間返します。 そして1時間後、関数は再びFacebookにデータを要求します。

このアプローチでは、この関数を1時間に1回呼び出すだけで、要求時間が1〜3秒長くなり、後続の呼び出しが即座に発行されます。

より複雑な例

約100のカテゴリと約50000の投稿があるウェブサイトがあり、ウェブサイトの単一の投稿デザインに、現在の投稿が含まれるカテゴリのN個の関連する投稿を表示するウィジェットがあるとします。 予想どおり、この複雑なクエリは、データベースから結果を取得してWebサイトに表示するのに時間がかかります。

ここで、同時にWebサイトにアクセスする10000人のユーザーがいると想像してください。 これは、クエリを実行する必要がある10000以上のデータベースリクエストがあることを意味します(これは、 wp_terms、wp_term_relationships、 wp_term_taxonomy、wp_postsテーブルを検索するため、10000超えるクエリであるため、複雑なクエリです)。関連カテゴリのN件の投稿の結果と、それらをフロントエンドに表示します。 これにより、データベースが過負荷になり、Webサイトの全体的な読み込み時間が遅れ、場合によってはデータベースの過負荷が原因でデータベースがクラッシュすることもあります。

そして、データベースのクエリとリクエストの数を最適化して削減するにはどうすればよいかという問題が発生します。 Transients APIを利用して、クエリオブジェクトをキャッシュするか、HTML出力全体をキャッシュすることができるのに、なぜこれほど多くのクエリがあるのでしょうか。 このようにして、データベースクエリの数を減らして最適化し、ウェブサイトのパフォーマンスとユーザーエクスペリエンスを向上させます。

この場合、クエリはwp_terms、wp_term_relationships、wp_term_taxonomy、wp_postsテーブルを検索して期待されるすべての結果を取得します。

これを実現する方法の完全な例を次に示します。

 関数show_posts_from_category(){
$ args = array(
'cat' => 555、//ランダムカテゴリID
'posts_per_page' => 8、//表示する関連する投稿のランダムな数
'No_found_rows' => true、
);

$ hash = md5($ args ['cat']); //カテゴリIDのMD5ハッシュ
$ transient_key = 'カテゴリ-'。 $ hash; //トランジェントキー

if(false ===($ posts_from_category_html = get_transient($ transient_key)))://トランジェントの有効期限が切れている/設定されていない

$ the_query = new WP_Query($ args); //クエリを取得します

ob_start(); //出力バッファリングをオンにします

while($ the_query-> have_posts()):$ the_query-> the_post();
?>
<div class = "item">
<div class = "bigthumb">
<a href="<?php the_permalink().?> "rel =" bookmark "title =" <?php the_title()。?> "> <?php if(has_post_thumbnail())the_post_thumbnail( 'big-thumb' ); ?> </a>
</ div>
<h3> <a href="<?php the_permalink().?> "rel =" bookmark "title =" <?php the_title()。?> "> <?php the_title(); ?> </a> </ h3>
<?php the_excerpt(); ?>
</ div>
<?php
終わり;

$ post_from_category_html = ob_get_contents(); //出力バッファの内容をクリアせずに取得します
ob_end_clean(); //この出力バッファリングをオフにします

set_transient($ transient_key、$ posts_from_category_html、$ transient_expire = 15 * MINUTE_IN_SECONDS); // 15分の有効期限でトランジェントを設定します

wp_reset_postdata();
endif;

$ post_from_category_htmlを返します。
}

最終的な考え

キャッシングは物事をスピードアップするための優れた方法ですが、キャッシングしているもの、どこで、いつ、どのようにキャッシュできるかを正確に知る必要があります。そうしないと、予期しない結果に直面するリスクがあります。

何かが意図したとおりに機能しているかどうかわからない場合は、常にプロファイリングに目を向けてください。データベースに対する各クエリを調べ、すべてのPHP関数呼び出し、タイミング、およびメモリ使用量を調べてください。

Transients APIは、WordPress Webサイトの読み込み時間を最適化し、優れたユーザーエクスペリエンスを提供するための優れた方法です。 プラグインとテーマでトランジェントを使用するのは簡単で、コードを数行追加するだけです。 長いデータベースクエリや複雑な処理データなど、適切な状況で使用すると、サイトの読み込み時間を数秒短縮できます。