phpenv/php-build の小ネタ集

## はじめに

この記事は、[PHP Advent Calender 2019](https://qiita.com/advent-calendar/2019/php) の15日目の記事です。

少し前に [phpenv/php-build で拡張がすこし入れやすくなりました](https://qiita.com/kunit/items/d2db65f81d57cad96b52) という記事を書いたんですが、それに引き続き、phpenv/php-build のちょっとした使い方を紹介したいと思います。

## phpenv をいれるならば、anyenv 経由がおすすめ

[phpenv の github のページ](https://github.com/phpenv/phpenv) を参考に `phpenv` および `php-build` を入れて使うことももちろんできるのですが、 [anyenv](https://github.com/anyenv/anyenv) を使ってインストールすることをおすすめします。

最初は `phpenv` だけ使っていたが、途中から `rbenv` も使う必要が出たというときに、この2つを共存させようとすると結構めんどくさいので、最初から `anyenv` を使っておくのがいいかと思います。

## phpenv でインストールする際に動作モードを切り替える

`phpenv install <version>` でインストールすると、デフォルトでは本番(production)モードでインストールされます。

`phpenv install --ini|-i <environment> <version>` というように `--ini` もしくは `-i` 引数で、 本番(production)モード もしくは 開発(development)モードのどちらでインストールするかが選択できるようになっています。

動作モードで何が違ってくるかというと、インストールされる `php.ini` の内容が違ってきます。

PHP をソースから build したことがある方にはおなじみなのですが、PHPのソースには次の2つの `php.ini` の雛形が用意されており、それのどちらを利用するか？ということを選択するということになります。

- php.ini-production
  - 本番で使うことを想定された設定
  - display_errors が Off になっていたり、 error_reporting で STRICT/DEPRECATED のエラーが抑制されていたりする
- php.ini-development
  - 開発で使うことが想定された設定
  - display_errors は On になっており、error_reporting はすべてエラーを出力するモードになっている

ローカル環境等で開発用に使う場合には、 `phpenv install -i development 7.4.0` のように、開発モードでインストールしておいたほうがいいと思います。

## build 方法を変更するには php-build の環境変数を使う

`phpenv` の `-i` 引数を紹介しましたが、それ以外に引数からいろいろとカスタマイズする方法は提供されておらず、build 時の設定をあれこれカスタマイズするには実際の処理を担当している `php-build` が提供している環境変数を利用することになります。

どのような環境変数が提供されているかの説明が `php-build` の README.md には説明がないので、そのあたりをいくつか紹介してみたいと思います。([php-build/php-build/man](https://github.com/php-build/php-build/blob/master/man/php-build.1.ronn) には書いてありますのでそちらもご確認ください)

### Xdebug を含めないようにする

`phpenv` ではデフォルトで Xdebug ありで build されます。それを抑制するには環境変数 `PHP_BUILD_XDEBUG_ENABLE`を `off` にすればOKです。

先程は、開発用に build するならば、 `-i` 引数を使ったほうがいいという説明をしましたが、本番用に使うならば、 `-i` 引数なしで `PHP_BUILD_XDEBUG_ENABLE=off` にするのがいいと思います。

### PECL で配布されている拡張を同時に入れる

こちらは、「[phpenv/php-build で拡張がすこし入れやすくなりました](https://qiita.com/kunit/items/d2db65f81d57cad96b52)」に以前書いたように `PHP_BUILD_INSTALL_EXTENSION ` を使うと同時に入れることができます。

前回の記事ではきちんと説明してなかったですが、これは `php-build` の環境変数ということになります。

### configure オプションを変更する

`php-build` では、次のような流れで configure オプションを組み立てています

1. `php-build/share/php-build/default_configure_options` でベースとなるオプションを定義
2. `php-bulid/share/php-build/definitions/<指定されたバージョン>` 内で追加定義されているオプションがあればそれも追加
3. 環境変数 `PHP_BUILD_CONFIGURE_OPTS` を追加
4. 環境変数 `CONFIGURE_OPTS` の内容を更に追加

上記のような流れになっているので、 `php-build` で設定されている configure オプションをカスタマイズしたい場合には、 `PHP_BUILD_CONFIGURE_OPTS` で追加定義するのがいいと思います。

このあたりは、以前 @hnw さんが「[php-buildでpeclコマンドをインストールする](https://qiita.com/hnw/items/825593951db52f1e937f)」という記事で紹介されています。

PHP の build をどのようにするのかをしらないとコントロールできないのが少々つらいという方は、 [phpbrew](https://github.com/phpbrew/phpbrew) を使ったほうがいいかもしれません。

## 早速 7.4.0 を build してみたい！

PHP 7.4 では configure オプションが結構変更されているために、対応に少々時間がかかりましたが、現状の phpenv/php-build で 7.4.0 も build できるようになりました。

ただし、今まで 7.3.x までを phpenv/php-build で build されてきた方でも今までと違った設定を追加する必要があるので注意です。

### 1. homebrew を使って以下のパッケージをインストール

```sh
brew install oniguruma krb5 openssl@1.1 icu4c libedit
```

この中で `oniguruma` は PHP 7.3 まではバンドルされていたのがされなくなったために必要となりました。

- [oniguruma ライブラリは PHP本体にバンドルされなくなりました。](https://www.php.net/manual/ja/migration74.other-changes.php#migration74.other-changes.mbstring)

### 2. PKG_CONFIG_PATH 環境変数を定義

```sh
export PKG_CONFIG_PATH="$(brew --prefix krb5)/lib/pkgconfig:$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix icu4c)/lib/pkgconfig:$(brew --prefix libedit)/lib/pkgconfig"
```

PHP 7.4 から `pkg-config` を利用するようになったため、この環境変数を設定することになりました。

- [pkg-config への移行](https://www.php.net/manual/ja/migration74.other-changes.php#migration74.other-changes.pkg-config)

### 3. phpenv で 7.4.0 をインストール

ここまで準備すれば、次のコマンドでインストールできるはず！

```sh
phpenv install -i development 7.4.0
```

## 最後に

つい最近、 「[みんなのPHP](https://gihyo.jp/book/2019/978-4-297-11055-0)」という本の第1章で PHP の環境構築周りのことを書いたんですが、その記事の macOS のセクションでは `homebrew` と `phpbrew` を使った PHP のインストール方法のみを説明して、 phpenv/php-build の説明を端折ったので、その補足というのも兼ねての記事でした。

phpenv/php-build は初心者の方にはおすすめしにくいものではあるんですが、私もちょこちょこコントリビュートしていってるソフトウェアなので、いい感じに使っていければいいなと思っています。