wp-cliのprofile機能を使い、wordpressの負荷を探す

wordpressが遅くて仕方が無いので、WP Fastest Cache等を入れてみたものの、まだ満足の行くスピードにはならない。検索してみると、wp-cliというコマンドラインツールがあり、その中のprofileという機能を使うとボトルネックを探してくれるそうだ。なお、以下はwordpressがインストールされているCentOSで行ってみたものだ。

※注意:この投稿は中途半端であり、原因を突き止めるまでには至っていない。
WordPressが重い(遅い)、P3(Plugin Performance Profiler)を使うである程度の解決ができたからだ。

wp-cliとは何か

これはwordpressに付属するものではなく、それとは別途インストールしなければならないものであり、GUI画面はなくキャラクタインターフェースのコマンドだ。詳細はhttps://wp-cli.org/ja/にある。ここにインストール方法が説明されている。

追加インストールするとは言っても、単一のphpスクリプトをダウンロードし、chmodで実行可能フラグを立て、それを/usr/local/binなどのパスの通った場所にwpという名前で置き、後はwpというコマンドを呼び出すだけだ。

もちろん、CentOS内に複数のwordpressがインストールされていてもよい。特定のwordpressのフォルダをカレントディレクトリにすることにより、wpコマンドはそのwordpressに対して動作する。

そして、もともとwpコマンドは、例えば、多数のwordpressインストールを行う業者のために、いちいちウェブ画面からテーマやらプラグインやらの操作をするのではなく、コマンドラインで自動的に行うために作られたもののようだ。

そのため、こういった「wordpressの状態を変更してしまう」コマンドが多く用意されているのだが、今回の目的では必要無い。あくまでも状態変更にはウェブ画面を使用するのであって、wpコマンドは状態の調査のみに使うものとする。

状態調査の簡単なコマンド例

例えばtheme statusというコマンドがある。

cd wordpressのトップフォルダ
wp theme status

rootで作業している場合は、実行を拒否されるので、–allow-rootをつける。

#wp theme status --allow-root
2 installed themes:
  A luxech    2.00
  P luxeritas 2.5.1

Legend: A = Active, P = Parent

インストールされているテーマ、親子関係が表示される。

他のコマンドについてはhttps://developer.wordpress.org/cli/commands/に一覧がある。

wp profileを使う準備

さて、wordpressが遅い原因を調べるためにはwp profileというコマンドを使う必要があるのだが、デフォルトでは入っておらず、プラグインとして追加する必要があるらしい。

その説明はhttps://developer.wordpress.org/cli/commands/profile/にある。

そこで以下を投入するが、失敗した。

# wp package install wp-cli/profile-command --allow-root
Installing package wp-cli/profile-command (dev-master)
Updating /root/.wp-cli/packages/composer.json to require the package...
Using Composer to install the package...
---
Loading composer repositories with package information
Updating dependencies
Resolving dependencies through SAT
Looking at all rules.

Dependency resolution completed in 2.101 seconds
Analyzed 7162 packages to resolve dependencies
Analyzed 593401 rules to resolve dependencies
Package operations: 1 install, 0 updates, 0 removals
Installs: wp-cli/profile-command:dev-master ac6c1c2
 - Installing wp-cli/profile-command (dev-master ac6c1c2)
PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/wp/vendor/symfony/process/Process.php on line 285
PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/wp/vendor/symfony/process/Process.php on line 285
PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/wp/vendor/symfony/process/Process.php on line 285
PHP Warning:  proc_open(): fork failed - Cannot allocate memory in phar:///usr/local/bin/wp/vendor/symfony/process/Process.php on line 285
Warning: Unable to launch a new process.
---
Error: Package installation failed.
Reverted composer.json.

メモリが足りないと言ってる。

WP-CLI でメモリ不足のエラーが出る時の対処法にならってみる。

# php -d memory_limit=-1 /usr/local/bin/wp package install wp-cli/profile-command --allow-root
Installing package wp-cli/profile-command (dev-master)
Updating /root/.wp-cli/packages/composer.json to require the package...
Using Composer to install the package...
---
Loading composer repositories with package information
Updating dependencies
Resolving dependencies through SAT
Looking at all rules.

Dependency resolution completed in 1.946 seconds
Analyzed 7162 packages to resolve dependencies
Analyzed 593401 rules to resolve dependencies
Package operations: 1 install, 0 updates, 0 removals
Installs: wp-cli/profile-command:dev-master ac6c1c2
 - Installing wp-cli/profile-command (dev-master ac6c1c2)
Writing lock file
Generating autoload files
---
Success: Package installed.

実は一度ではうまくいかず、他でメモリを食いすぎていたので、そちらを削除したらうまくインストールできるようになった。

profileコマンドを使ってみる

[WordPress] 負荷がかかっている処理を見つけるのに wp profile がとても便利だったを参考にしてprofileを使ってみる。

しかし、以下のようなエラーが発生する。

# wp profile stage --fields=stage,time,cache_ratio --allow-root
PHP Fatal error:  Call to a member function default_options() on null in /****/wp-content/plugins/ga-google-analytics/inc/plugin-core.php on line 171
Fatal error: Call to a member function default_options() on null in /****/wp-content/plugins/ga-google-analytics/inc/plugin-core.php on line 171
(この後ページのhtmlがすべて表示されている)

ga google analyticsプラグインのコードに問題があるらしいのだが、これはプラグインを更新することで解決した。

次に以下を投入すると、何らかの値が表示される。

# wp profile stage --fields=stage,time,cache_ratio --allow-root
+------------+---------+-------------+
| stage      | time    | cache_ratio |
+------------+---------+-------------+
| bootstrap  | 0.9996s | 91.23%      |
| main_query | 0.0364s | 82.9%       |
| template   | 1.377s  | 91.28%      |
+------------+---------+-------------+
| total (3)  | 2.413s  | 88.47%      |
+------------+---------+-------------+

これらの意味を理解しなくてはいけないのだが、最初に書いた通り、P3である程度の解決を見たので今回はここまでとする。