PHP
WordPress
wp-cli
xserver
PHP7

Xserver で wp-cli を動かす

Xserverでwp-cliを動かそうとしても、なんかエラーばかりで全然動いてくれなかったのだが、いろいろ試行錯誤の結果なんとかなった、という記録。

結論

wp-cliをphp7で動かすなら、 /opt/php-7.1.2/bin/php を用いる。

$ /opt/php-7.1.2/bin/php ~/bin/wp-cli.phar help

NAME
  wp

DESCRIPTION
  Manage WordPress through the command-line.

SYNOPSIS
  wp <command>

SUBCOMMANDS
  akismet             Filter spam comments.
  backwpup            Class for WP-CLI commands
  ...

.bashrc に alias 書いておけば幸せになれる

$ echo 'alias wp="/opt/php-7.1.2/bin/php ~/bin/wp-cli.phar ' >> ~/.bashrc
$ source ~/.bashrc
$ wp help

Xserver のバージョン

Xserverは、サーバーが稼働したタイミングによりいくつかのバージョンがあり、バージョンごとに仕様が異なるので、一言に「Xserverで動かす」といっても、必ずしもそのとおりにやれば動いてくれるわけではない。(※ バージョンと呼ぶのはちょっと違う気がするけど、まぁ察してください)

このバージョンは、サーバー番号から判断することができる。ざっくり、下記の3種類の仕様があるっぽい。

  • sv1〜sv855
  • sv856〜sv1999
  • sv2001〜現在

データベース仕様一覧 | レンタルサーバー【エックスサーバー】

今回、wp-cliを動かしたのは、一番古い sv1〜sv855 に該当するサーバーである。他の記事を見る限り、それ以外のサーバーだと、特に苦労することなく動くっぽいのだが、初期サーバーだとphp-cliが走らせるPHPのバージョンが5.1.xになるため、うまく動かないのである。

初期サーバーでの問題点

ひとまず純粋にwp-cliを入れて動かしてみる

$ cd ~/bin/
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ wp-cli.phar --info

PHP Fatal error:  Class 'Phar' not found in /home/<user_name>/bin/wp-cli.phar on line 3
X-Powered-By: PHP/5.1.6
Content-type: text/html

この調子である。
というのも、wp-cli自体の実行要件が PHP5.3.29以上 とあり、Xserverの PHP5.1.6 では要件を満たせていないのだ。
Command line interface for WordPress | WP-CLI

php7を使う

Xserverには、初期サーバーでもphp7が使えるようになっている。

$ whereis php7
php7: /usr/bin/php7.1 /usr/bin/php7.0

php7を用いて実行すれば動くかもしれない、として試した結果が下記である

$ php7.1 ~/bin/wp-cli.phar --info

X-Powered-By: PHP/7.1.2
Content-type: text/html; charset=UTF-8

OS:     Linux 2.6.18-426.el5.BET #1 SMP Tue Feb 13 21:12:18 JST 2018 x86_64
Shell:  /bin/bash
PHP binary:     /opt/php-7.1.2/bin/php-cgi
PHP version:    7.1.2
php.ini used:   /opt/php-7.1.2/etc/php.ini
WP-CLI root dir:        phar://wp-cli.phar
WP-CLI vendor dir:      phar://wp-cli.phar/vendor
WP_CLI phar path:       /home/<user_name>/bin
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 1.5.0

こいつ…動くぞ!!

というわけで、wp-cliが動いた…と思って、実作業に移ろうとすると…

# バックアップしたDBのリストア
$ php7.1 ~/bin/wp-cli.phar db import dump.sql --path=wp/

PHP Warning:  fwrite() expects parameter 1 to be resource, string given in phar:///home/<user_name>/bin/wp-cli.phar/php/WP_CLI/Loggers/Base.php on line 61
X-Powered-By: PHP/7.1.2
Content-type: text/html; charset=UTF-8

…あれ、Successが表示されないぞ…?
別の方法でDBを確認するが、やはりリストアができていない。
ちなみに、 wp-cli help も動いてない。

$ php7.1 ~/bin/wp-cli.phar help

PHP Warning:  proc_open(): Descriptor item must be either an array or a File-Handle in phar:///home/<user_name>/bin/wp-cli.phar/php/utils.php on line 1346
PHP Warning:  proc_close() expects parameter 1 to be resource, boolean given in phar:///home/<user_name>/bin/wp-cli.phar/php/commands/help.php on line 139
X-Powered-By: PHP/7.1.2
Content-type: text/html; charset=UTF-8

ヘルプも読めないこんな世の中じゃ

「うごかない」では済まされない

一応、エラーメッセージは表示されているが、調べてみるとphp.iniとかの設定を変える必要がありそうで、ちょっともうこれ大変すぎるだろ、となってしまった。

同様の問題で悩んでいる方の記事を見ると、

php-cli使うと治る

という情報があるらしく、それも試してみたが、php-cli がPHP5.1.6の実行になっているため、やはりうまく動かなかった。
エックスサーバーにWP-CLIをインストールする話。失敗?。 | がまログ

実は /usr/bin/php7.1 は php-cli ではない

先の wp-cli --infoの結果を見ればわかるのだが、実はそれを動かしていた/usr/bin/php7.1は、cliではない。
では何かと言うと、(正直良くわかっていないが)これは php-cgi というコマンドのようだ。

$ ls -l /usr/bin/php7.1

lrwxrwxrwx 1 root root 26 May 12  2017 /usr/bin/php7.1 -> /opt/php-7.1.2/bin/php-cgi

今はCLIでphpを動かしたいので、php-cliなphpコマンドを探してみると、php-cgiを同じディレクトリに、phpというコマンドを発見した。

$ ls /opt/php-7.1.2/bin/

pear  peardev  pecl  phar  phar.phar  php  php-cgi  php-config  phpdbg  phpize

こ、これだ! これに違いない!

$ wp で実行させる

上記のphpコマンドを直接指定し、wp-cliを実行してみる。

$ /opt/php-7.1.2/bin/php ~/bin/wp-cli.phar --info

OS:     Linux 2.6.18-426.el5.BET #1 SMP Tue Feb 13 21:12:18 JST 2018 x86_64
Shell:  /bin/bash
PHP binary:     /opt/php-7.1.2/bin/php
PHP version:    7.1.2
php.ini used:   /opt/php-7.1.2/etc/php.ini
WP-CLI root dir:        phar://wp-cli.phar
WP-CLI vendor dir:      phar://wp-cli.phar/vendor
WP_CLI phar path:       /home/<user_name>/<domain>/public_html
WP-CLI packages dir:
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 1.5.0
$ /opt/php-7.1.2/bin/php ~/bin/wp-cli.phar help

NAME
  wp

DESCRIPTION
  Manage WordPress through the command-line.

SYNOPSIS
  wp <command>

SUBCOMMANDS
  akismet             Filter spam comments.
  backwpup            Class for WP-CLI commands
  ...

うごいたー!!!
実作業ではどうだろう。

# バックアップしたDBのリストア
$ wp db import dump.sql --path=wp/
Success: Imported from 'dump.sql'

Success でたー!!!

fwrite()のWarnも、proc_open()のWarnもでない状態で、ちゃんと目的の作業が可能となった。
この後、 wp search-replacewp rewrite flush もやってみたが、想定通りの動きをしてくれており、これで基本的には問題がなさそうだ。

結論は、最初に書いてしまったのでアレだが、
sv855以前のXserverで、wp-cliをphp7上で動かすなら、 /opt/php-7.1.2/bin/php を用いる。
で、良さそうである。

参考記事