部分的なキャッシュには、以下のようなコンテンツが適しています。いずれもサイト全体のページに横断的に表示される内容です。
なお、(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倍以上も処理時間が短縮されました。しかしこの場合でもネットワークをまたいだアクセスは、かなりのボトルネックになってしまいます。
WordPress脆弱性発覚、その後の状況 4.7.2リリース時に脆弱性が公開されなかった理由
容易にWebサービスを高速化できるNginxを使いこなすための秘訣とは
高速・軽量・高機能……Nginxの基礎知識
WordPress自体のチューニングが必要な理由と高速化の基本的な考え方Copyright © ITmedia, Inc. All Rights Reserved.