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〜現在

[データベース仕様一覧 \| レンタルサーバー【エックスサーバー】](https://www.xserver.ne.jp/manual/man_db_spec.php)

今回、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](https://wp-cli.org/ja/)

## 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をインストールする話。失敗？。 \| がまログ](http://gama.e-creators.info/20160312-wp-cli-to-x-server)

# 実は /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-replace``` や ```wp rewrite flush``` もやってみたが、想定通りの動きをしてくれており、これで基本的には問題がなさそうだ。

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

# 参考記事
- [エックスサーバーにWP\-CLIをインストールする話。失敗？。 \| がまログ](http://gama.e-creators.info/20160312-wp-cli-to-x-server)
- [WP\-CLI インストール \| SAKI Web Design](https://sakidesign.com/wp-cli-install/)