WordPressの言語ファイル読み込みが遅い(管理画面+MO Cache+W3 Total Cache)

WordPressの日本語版と英語版のレスポンスは大きく違い、日本語版は遅い。 XDebugでProfilingしてみると、l10n.phpのload_default_textdomain関数が時間を要しているらしい。

Function Self Cum. File Called from
load_default_textdomain - 1,584ms l10n.php wp-settings.php (306)

多言語化用のja.moなどのようなMOファイルを読み込むのに時間を要するようだ。
WordPressにはこの部分をキャッシュして高速化するMO Cacheという有名なプラグインがあり、すでに導入している。

このMO Cacheというプラグインは読み込んだデータをwp_cache_***とかのWordPressのキャッシュ機構に保存して、毎回読み込みを行わないようになっている。

素晴らしい!

MO Cacheプラグインは単独ではキャッシュした内容が次のセッションに引き継がれないため、 WordPressにキャッシュ永続化の機能を追加する必要がある。
(object-cache.phpを用意する必要がある。)

今回は永続化のためにW3 Total CacheのObject Cacheを利用した。

この場合、WordPressの一般ユーザー側のHTML生成処理は高速されるのだが、管理画面ではあまり速く感じなかった。

WordPressの管理画面の処理を調べてみると、MO Cacheのキャッシュがヒットしていないようだ。

MO Cacheが一度生成したデータをキャッシュしようとwp_cache_setを呼ぶが、この関数内でデータが保存されない。

wp_cache_setからW3 Total Cache側を見ていくと、どうやら、このあたり。

w3-total-cache\lib\W3\ObjectCache.php
\W3_ObjectCache::_check_can_cache_runtime

 if ($this->_caching) {
            if (defined('WP_ADMIN')) {
                $this->_can_cache_dynamic = false;
                $this->cache_reject_reason = 'WP_ADMIN defined';
                return $this->_can_cache_dynamic;
            }
        }

wp_cache_set時に、_check_can_cache_runtimeのチェックがかかり、WP_ADMINが定義されている場合はキャッシュされないようだ。

W3 Total CacheのObject Cacheは管理画面では効かないのかな?結果的にMO Cacheも管理画面では効かない。

対策としては、

  • 方法1 Object CacheをW3 Total Cache以外のもので行う。

    たとえば、 Memcached backend for the WP Object Cache WP File Cache ただし、管理画面での挙動は未調査。

  • 方法2 MOファイル(言語ファイル)のみキャッシュできるもの そもそも管理画面のObject Cacheが全部有効になっても、他の機能に影響しないのかわからず、ちょっと怖い。
    しかし、MOファイルはほとんどいつでもキャッシュしてても良いように思う。
    MOファイルのみキャッシュするプラグインが無いか探していたら、これ良さそうに思う。
    001 Prime Strategy Translate Accelerator

  • 方法3 MOファイル自体のパースを高速化する。
    そもそも、言語ファイルはPOファイルを作って、MOファイルに変換したものだが、このパースにこんなに時間がかかるならあんまり良くないように思う。
    POファイルからPHPファイルに変換すれば、PHPエンジンが解析してくれるし、Opcacheとかも効きそうなのに… ここは未調査。

とりあえず、方法2の 001 Prime Strategy Translate Acceleratorを試してみようと思う。

インストールしてみると、おお、サクサクしている!ように思う! しばらく使ってみよう!