◆ PHP で動いてるので PHP が必要
◆ nodebrew みたいに binary-install できない
◆ phpbrew にはパス通しておく
◆ fedora 23 だとインストール必要だったの
  ◆ libxml2-devel openssl-devel bzip2-devel readline-devel libsxlt-devel
  ◆ 足りないって言われたら devel 版をインストールするとなんとかなるはず

この記事書くときに

そういえば Linux の PHP はまだ 7 にしてないなぁ
fedora の標準だから 5.6 だったかなー
どうやって 7 いれようかー

と思ってバージョン管理するツールをググってると
  • phpenv
  • phpbrew

などがあるみたい

node.js で nodebrew 使ってるし同じ brew な phpbrew にしよう と適当に決めました

インストール

yum (dnf) にはないみたいなので 直接ダウンロードします
wget https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
./phpbrew init

init すると↓を .bashrc に追加して みたいなメッセージがでました
export PHPBREW_SET_PROMPT=1
source /home/user/.phpbrew/bashrc

export は source の前だそうです

ですが この SET_PROMPT はつけるとこうなります
~ > user@fedora [php:5.6.17-system]
$ ls /
bin  dev home lib64 media opt root sbin sys usr
boot  etc lib lost+found mnt proc run srv tmp var
~ > user@fedora [php:5.6.17-system]
$ phpbrew use 7.0.1
~ > user@fedora [php:7.0.1 -phpbrew]
$
プロンプトに常に php バージョンが表示されます
そんな php のための PC ってわけじゃないのにずっと出てるのは邪魔です
なので export の行は↑みたいな表示をしたい人だけでいいです

機能

使えるコマンドは一覧はこんなものがあります
COMMANDS
  help Show help message of a command
  app php app store
  init Initialize phpbrew config file.
  known List known PHP versions
  install Install php
  list List installed PHPs
  use Use php, switch version temporarily
  switch Switch default php version.
  each Iterate and run a given command over all php versions managed by PHPBrew.
  config Edit your current php.ini in your favorite $EDITOR
  info Show current php information
  env Export environment variables
  extension List extensions or execute extension subcommands
  variants List php variants
  path Show paths of the current PHP.
  cd Change to directories
  download Download php
  clean Clean up the source directory of a PHP distribution
  update Update PHP release source file
  ctags Run ctags at current php source dir for extension development.
  list-ini List loaded ini config files.
  self-update Self-update, default to master version
  remove Remove installed php build.
  purge Remove installed php version and config files.
  off Temporarily go back to the system php
  switch-off Definitely go back to the system php

help コマンドで各コマンドの機能と使い方が見れます
こんな感じ
./nodebrew help known

よくありそうなコマンドが並んでますが 多少違うものもあります

known コマンドで php のバージョンリストを見て install で指定したバージョンをインストール
use で一時的に切り替えて switch で完全に切り替えます

インストール済みの一覧は list で確認できます
update では known で確認できる一覧を更新できます
phpbrew 自体をアップデートするときは self-update です

each は phpbrew で管理されてる全バージョンでコマンドを実行してくれるみたいです
php の各バージョンごとの動きを確認できるのは便利そうです

download は最初 install-binary のことで 自分でビルドしないでビルド済みの rpm とかを取得してインストールするのかなって思ったのですが 違いました
ソースをダウンロードするだけでビルドはしないオプションのようです
install では download したあとにビルドしています

off は一時的に phpbrew 使わないでデフォルトでインストールされてる php にバージョンを切り替えます
switch-off は一時的じゃない版です

known

known 使うとこんな感じです
[user@fedora ~]$ ./phpbrew known
===> Fetching release list...
[==================================================================] 2.69/2.69KB 100%
7.0: 7.0.3, 7.0.2, 7.0.1, 7.0.0 ...
5.6: 5.6.18, 5.6.17, 5.6.16, 5.6.15, 5.6.14, 5.6.13, 5.6.12, 5.6.11 ...
5.5: 5.5.32, 5.5.31, 5.5.30, 5.5.29, 5.5.28, 5.5.27, 5.5.26, 5.5.25 ...
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38 ...
5.3: 5.3.29, 5.3.28 ...
You can run `phpbrew update` to get a newer release list.

最初はデータの取得がありました
2 回目以降はデータ取得しないので 新しいバージョンがリリースされたとかでリストの更新したいときは update コマンドです

後半 ... で省略されてるのを全部出すには -m をつけると全部でます
[user@fedora ~]$ ./phpbrew known -m
7.0: 7.0.3, 7.0.2, 7.0.1, 7.0.0
5.6: 5.6.18, 5.6.17, 5.6.16, 5.6.15, 5.6.14, 5.6.13, 5.6.12, 5.6.11, 5.6.10, 5.6.9,
  5.6.8, 5.6.7, 5.6.6, 5.6.5, 5.6.4, 5.6.3, 5.6.2, 5.6.1, 5.6.0
5.5: 5.5.32, 5.5.31, 5.5.30, 5.5.29, 5.5.28, 5.5.27, 5.5.26, 5.5.25, 5.5.24, 5.5.23,
  5.5.22, 5.5.21, 5.5.20, 5.5.19, 5.5.18, 5.5.17, 5.5.16, 5.5.15, 5.5.14, 5.5.13,
  5.5.12, 5.5.11, 5.5.10, 5.5.9, 5.5.8, 5.5.7, 5.5.6, 5.5.5, 5.5.4, 5.5.3, 5.5.2,
  5.5.1, 5.5.0
5.4: 5.4.45, 5.4.44, 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38, 5.4.37, 5.4.36,
  5.4.35, 5.4.34, 5.4.33, 5.4.32, 5.4.31, 5.4.30, 5.4.29, 5.4.28, 5.4.27, 5.4.26,
  5.4.25, 5.4.24, 5.4.23, 5.4.22, 5.4.21, 5.4.20, 5.4.19, 5.4.18, 5.4.17, 5.4.16,
  5.4.15, 5.4.14, 5.4.13, 5.4.12, 5.4.11, 5.4.10, 5.4.9, 5.4.8, 5.4.7, 5.4.6,
  5.4.5, 5.4.4, 5.4.3, 5.4.2, 5.4.1, 5.4.0
5.3: 5.3.29, 5.3.28

5.3 未満のバージョンを出すには -o とヘルプに書いてましたが ちゃんと動作しなかったです

install

さっそく インストールしてみます
今回は Windows にバージョンを合わせたかったので 7.0.1 にします
./phpbrew install 7.0.1

何かエラーが
configure: error: xml2-config not found. Please check your libxml2 installation.

libxml2 が必要らしいです
だけど確認したら入ってます

ぐぐってみると devel 版が必要だそうです
stack overflow は頼りになります
sudo dnf install libxml2-devel

すると次のエラーが
configure: error: Cannot find OpenSSL's <evp.h>
openssl は入ってるのでとりあえず openssl-devel を入れてみる

うまく行って次は
configure: error: Please reinstall the BZip2 distribution
bzip2-devel をインストール
configure: error: Please reinstall readline - I cannot find readline.h
readline-devel を(ry
configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
libxslt-devel (ry

と ここまで来るとビルドが開始しました

fedora23 で特に追加でパッケージ入れてない状態でこれだけです
centos などもっとデフォルトパッケージが少ない環境ではもっとエラーが出そうですが とりあえずエラーと言われてるところの devel 版を入れればなんとかなると思います

use

php7 を使ってみます
[user@fedora ~]$ ./phpbrew switch 7.0.1
You should not see this, if you see this, it means you didn't load the ~/.phpbrew/bashrc script, please check if bashrc is sourced in your shell.

あれ エラーだ

エラーメッセージの ~/.phpbrew/bashrc はすでに読み込んでるはずです
とりあえずもう一回読み込んでは見ましたがだめでした

ググッて出てくる方法でも特に改善しなかったです

もしかしてすでに php が入ってるのが原因?と思って
sudo dnf remove php

変わらずエラー…… というか動いていた list とかまでもエラーになりました
エラーメッセージを見ると /bin/env php が見つからないとか言われて ここで初めて phpbrew 自体が php で動いてると知りました

(php は再度 dnf でインストールしました)


ふと ./phpbrew なのがだめなのでは?と思って /bin/ に移動してみる

すると

動きました!

phpbrew の少し見てみると phpbrew のパスを取得してるところがあったので コマンドによっては phpbrew 自体にパスが通っていないと動かないようです

その他

<?php ネスト?

phpbrew の中見ていて気になったのは
<?php
何かコード

<?php
何かコード

と php タグが終了していないところでまた php タグが書かれているところ
これがいくつかあって また php タグじゃないところで文字があったのに出力されていません

どういうしくみなんだろうとよく見てみると __halt_compiler(); がありました

この関数はコンパイラがここで処理をやめてくれるみたいで exit; みたいなものですが コンパイラが確認する段階で ここまで!って指定なので それ以降に構文が正しく書かれてる必要がないです
exit の場合は 全体が php の構文としてエラーがあると実行してくれませんが __halt_compiler だと実行し始める前に処理しているので大丈夫ということです

この機能は バイナリデータを 1 つのファイルに埋め込むために使うみたいで php として構文エラーだと思ってたところは php のコードではあるのですが phpbrew で直接実行する範囲外ということでした

5.3 以前のが出ないのはもしかして

それと php で動いてると知って 公式を見てくると 5.3 以上が必要みたいです
もしかして known で 5.3 未満でないのは 5.2 とかされてしまうと phpbrew が動かなくなるから?
こういうバージョン管理するツール自体をその言語で作ってしてしまうのってどうなのでしょうね
私は別の方がいいと思うんですけど

nodebrew と比較

nodebrew でも自分でビルドするときは gcc がないとか python が 3 だとかいろいろ面倒なのがあって最近は install-binary しかやらなくなりましたが phpbrew も同じくビルドやるときは色々面倒でした
バイナリファイル落としてくるモードがあればいいのにな