“WordPressを簡単に1620倍高速化“する「部分キャッシュ」活用テクニックとにかく速いWordPress(20)(2/4 ページ)

» 2017年11月06日 05時00分 公開
[田島優也プライム・ストラテジー]

効率的な部分キャッシュを実現する「Transients API」

 部分的なキャッシュには、以下のようなコンテンツが適しています。いずれもサイト全体のページに横断的に表示される内容です。

  • (1)ランキング情報のように、API(Application Programming Interface)を呼び出して生成する情報(サイドバー)
  • (2)コンテンツの最上位階層ページへのリンク(グローバルナビゲーション)
  • (3)会社概要など、ほぼ静的なページへのリンク(フッターナビゲーション)

 なお、(1)のように、外部API経由でデータを取得する処理がある場合には注意が必要です。APIサーバのレスポンス生成処理に加えて、ネットワーク上のレイテンシが深刻なボトルネックになる可能性があります。また、SaaS(Software as a Service)やASP(Application Service Provider)のサービス規定によっては、1日にAPIを呼び出せる回数に上限がある可能性もあります。

 2017年8月25日に全国規模で大規模なネットワーク障害が発生したのは記憶に新しいと思います。外部API経由で呼び出す仕組みは、こういった場合にも自社サービスの障害につながるリスクがあります。そういったリスクを避けたいならば、なるべくネットワークをまたいだアクセスは抑えたいところです。

 それを解決する最適な手段がWordPressの「Transients API」です。Transients APIは「期限付きで半永続的なキャッシュを保持できるようにする」機能です。

 WordPressのAPIサーバから認証用ユニークキーを取得するサンプルコードで確認してみます。

<?php
 
require_once __DIR__ . '/DocumentRoot/wp-load.php';
 
// Transients API使用なし
function get_no_transients_keys () {
    $results = false;
    $auth_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
    if ( ! is_wp_error( $auth_keys ) ) {
            $results = $auth_keys['body'];
    }
    return $results;
}
 
// Transients API使用あり
function get_transients_keys () {
    if ( false === ( $results = get_transient( 'sample_api' ) ) ) {
        $auth_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
        if ( ! is_wp_error( $auth_keys ) ) {
            $results = $auth_keys['body'];
            set_transient( 'sample_api', $results, 12 * HOUR_IN_SECONDS );
        }
    }
 
    return $results;
}
 
$start = microtime(true);
for ($i=0; $i< 10; $i++) {
        $r = get_no_transients_keys();
}
$end_time = microtime(true) - $start;
echo sprintf( '%.10f秒', $end_time ) . PHP_EOL;
 
$start = microtime(true);
for ($i=0; $i< 10; $i++) {
        $r = get_transients_keys();
}
$end_time = microtime(true) - $start;
echo sprintf( '%.10f秒', $end_time ) . PHP_EOL;
「transients.php」のサンプル

 このコードは、「get_no_transients_keys」関数がTransients APIを使わず、「get_transients_keys」関数がTransients APIを使用する例です。いずれも同一のAPIサーバに10回リクエストを投げる処理を行っています。処理時間の結果は下記の通りです。

5.6488840580秒 # Transients API使用なし
0.0009069443秒 # Transients API使用あり
Transients API使用時の処理時間

 Transients APIを使わない場合は約5.6秒かかっていたのに対して、Transients APIを使うと0.0009秒と、6200倍以上も処理時間が短縮されました。しかしこの場合でもネットワークをまたいだアクセスは、かなりのボトルネックになってしまいます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。