K4750.NET

WPLANG変更によるWordPressの高速化

wp-config.phpのWPLANGの値の変更によるWordPressの高速化(高速化ネタその1の続き)。結論から言うと、レスポンスタイムが、APC(Alternative PHP Cache)を導入した状態からさらに約3割削減となった(1297.319ミリ秒→886.885ミリ秒)。ようやくレスポンスタイムが1秒を切ったことになる。


1.プロファイリング

XHProfを使用して、処理に時間がかかっているファンクションを調査してみると、wp-settings.phpから呼び出されるload_default_textdomainの処理時間が、全体の処理時間の35%を占めていることが判明。

このファンクションはwp-config.phpWPLANG定数の設定値に従い、wp-content/languages/ja.moファイル等を読み込む処理である。このja.moファイルは、簡単に言うと英→日の辞書であり、WordPressはこの辞書を使用して管理画面等を日本語表示する。

本サイトはテーマを自作しており、また、この翻訳機構を必須とするプラグインも導入していないため、ja.moの読み込みは無用である。よって、このファイルを読み込まないよう設定することとした。


2.WPLANG定数の変更

wp-config.phpWPLANG定数の値をja(日本語)にするとja.moファイルを読み込んでしまうので、違う値(en(英語))に変更する。ただし、管理画面は日本語表示したいので、ここを参考に、WPLANG定数の定義を以下のように書き換える。

if (strpos($_SERVER['REQUEST_URI'], '/wp-admin/') === 0) {
    define ('WPLANG', 'ja');
} else {
    define ('WPLANG', 'en');
}

3.ab(ApacheBench)の結果

abコマンド(ab -c 20 -n 200 http://www.k4750.net/(20多重で200リクエスト))の実行結果について、前回(APCの導入)との比較を以下に示す。

テスト時間(秒) 秒間リクエスト数 リクエスト時間
(ミリ秒)(平均)
初期状態 26.370 7.58 2637.035
APC導入後 12.973 15.42 1297.319
WPLANG変更後 8.869 22.55 886.885

4.余談

ja.moは使用しつつレスポンスタイムを低下させない方法としてMO CacheというWordPressプラグインを使用する選択肢もあるようだが、本サイトではその必要がなかったので、上記対応を行うこととした。

APC(Alternative PHP Cache)によるWordPressの高速化

本サイトの表示速度を上げるためにAPCを導入した(事前にMaxClientsの値を20に設定済)。結論から言うと、レスポンスタイムが半減した。


1.ab(ApacheBench)の結果

abコマンド(ab -c 20 -n 200 http://www.k4750.net/(20多重で200リクエスト))の実行結果について、導入前後の測定値を比較すると、APCの導入だけでリクエスト時間(Time per request)が半減したことが分かる。

テスト時間(秒) 秒間リクエスト数 リクエスト時間
(ミリ秒)(平均)
導入前 26.370 7.58 2637.035
導入後 12.973 15.42 1297.319

2.環境および導入

環境についてはこちらを参照。導入方法は以下のとおり。

# apt-get install php-apc
# service apache2 restart

PHP拡張「inclued」のセットアップまとめ

WordPressのテンプレートファイルのロード順および呼び出し階層」にて使用した、PHP拡張「inclued(Inclusion hierarchy viewer)」のセットアップ手順をまとめておく。


1.PECLコマンドのインストール

PECL(PHP Extension Community Library)をインストールするための準備を行う。

# aptitude install make
# aptitude install php5-dev
# aptitude install php-pear

2.incluedのインストール

# pecl install channel://pecl.php.net/inclued-0.1.3
...
Installing '/usr/lib/php5/20090626/inclued.so'
install ok: channel://pecl.php.net/inclued-0.1.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=inclued.so" to php.ini

3.php.iniの変更

/etc/php5/apache2/php.iniに以下を追記する。

extension=inclued.so
inclued.enabled=On
inclued.dumpdir=/tmp

4.incluedファイルの生成

本サイトの場合はWordPressのホームページ(http://www.k4750.net/index.php)にアクセスすると、サーバ上の/tmpディレクトリに「inclued.*.*」というファイルが生成される。


5.incluedファイルの解析

呼び出し階層を見たい場合は、以下のファイル(inc.php)を作成し(「inclued.26144.1」と「/…/index.php」は環境に応じて読み替えてください)、

<?php
$i = unserialize(file_get_contents("/tmp/inclued.26144.1"));
function inc($fromfile, $idx) {
  global $i;
  foreach ($i['includes'] as $j) {
    if ($j['fromfile'] == $fromfile) {
      printf("%s%d: %s (%s)n", $idx, $j['fromline'], $j['opened_path'], $j['operation']);
      inc($j['opened_path'], $idx.'  ');
    }
  }
}
inc('/…/index.php', '');
?>

phpコマンドを実行する。

$ php inc.php

6.参考