部分的なキャッシュには、以下のようなコンテンツが適しています。いずれもサイト全体のページに横断的に表示される内容です。
なお、(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;
このコードは、「get_no_transients_keys」関数がTransients APIを使わず、「get_transients_keys」関数がTransients APIを使用する例です。いずれも同一のAPIサーバに10回リクエストを投げる処理を行っています。処理時間の結果は下記の通りです。
5.6488840580秒 # Transients API使用なし 0.0009069443秒 # Transients API使用あり
Transients APIを使わない場合は約5.6秒かかっていたのに対して、Transients APIを使うと0.0009秒と、6200倍以上も処理時間が短縮されました。しかしこの場合でもネットワークをまたいだアクセスは、かなりのボトルネックになってしまいます。
Copyright © ITmedia, Inc. All Rights Reserved.