Transients APIではセッションをまたいだ半永続的キャッシュを保持するという性質上、デフォルトではデータベースが格納場所として利用されます。
しかしながら、WordPressの高速化チューニングの方法として、「データベースへの接続をいかに減らすか」ということが1つのポイントになってきます。それをサポートする機能が、「WordPress Object Cache」です。
WordPress Object CacheはWordPress内での処理において取得に時間を要するデータをメモリ上に保持しておき、それ以降のデータ取得を高速化させる機能です。
以前、「MariaDBの設定を調整してデータベースの処理を高速化する」ではデータベース上でのクエリ実行を高速化するためのチューニングを行いました。しかし、これはその前段階で行うアプリケーションレベルのチューニング手法の1つです。
下記はWordPressの標準的なインストールで作成される「wp_postsテーブル」から、全レコードを取得するサンプルです。
<?php require_once __DIR__ . '/DocumentRoot/wp-load.php'; // WordPress Object Cacheなし function get_no_cache_sample_posts ( $post_type ) { global $wpdb; $result = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'publish'", $post_type ) ); return $result; } // WordPress Object Cacheあり function get_cache_sample_posts ( $post_type ) { global $wpdb; $result = wp_cache_get( $post_type ); if ( false == $result ) { $result = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'publish'", $post_type ) ); wp_cache_set( $post_type, $result ); } return $result; } $start = microtime(true); for ($i=0; $i<1000; $i++) { $r = get_no_cache_sample_posts( 'post' ); } $end_time = microtime(true) - $start; echo sprintf( '%.10f秒', $end_time ) . PHP_EOL; $start = microtime(true); for ($i=0; $i<1000; $i++) { $r = get_cache_sample_posts( 'post' ); } $end_time = microtime(true) - $start; echo sprintf( '%.10f秒', $end_time ) . PHP_EOL;
このコードは「get_no_cache_sample_posts」関数がWordPress Object Cacheを使用しない例で、「get_cache_sample_posts」関数がWordPress Object Cacheを使用する例です。
いずれも同一のクエリ結果を1000回取得する処理を行います。処理時間の結果は下記の通りです。
0.1964449883秒 # WordPress Object Cache使用なし結果 0.0009789467秒 # WordPress Object Cache使用あり結果
「WordPress Object Cache使用なし」の場合が0.2秒ほどかかっていたのに対して、「使用あり」の場合は0.0009秒ほどなので、200倍以上処理時間が短縮されました。
データベースでのクエリ実行時間が削減されることはもちろんですが、WordPressがネットワーク経由でデータベースとやりとりを行う場合、それに伴うデータ転送時間も丸ごとカットできるので大幅な速度改善を見込むことができます。
Copyright © ITmedia, Inc. All Rights Reserved.