◆ 古い環境でコンパイルした phpbrew を見てた
◆ 古い php だと共有ライブラリが見つからなくなってた
◆ 再ビルドし直して解決
◆ php コマンドが phpbrew をみるようになってたので PATH を変更して標準インストールの php を参照するように修正必要だった

動かない

しばらくバージョン挙げてなかった fedora をアップグレードしました
24 くらい?だったのを 27 にしました

それからしばらく経っていたのですが php をちょっと使いたくなって実行すると

% php -a
php: error while loading shared libraries: libreadline.so.6: cannot open shared object file: No such file or directory

なんかエラーが出ています
dnf で php のアップデートをしても最新版のようです
その他全部のパッケージをアップデートしても変わらずでした

エラーメッセージを見ると共有ライブラリがないみたいです
OS アップデートで見たことあるようなメッセージですが エラーもなく最新版に更新できたのに出るのは変な気もします

原因

考えられる原因を探してると 「そういえば phpbrew つかっていたっけ」 ということに気づきました

% type php
php is /home/me/.phpbrew/php/php-7.1.0/bin/php

確認すると phpbrew の php をみています
alias じゃなくて PATH で phpbrew を見るようになってるようです

PATH は
PATH=/home/me/.phpbrew/php/php-7.1.0/bin:/home/me/.phpbrew/bin:~~

ひとまず解除して通常の php を使うようにしよう と思ったのですが phpbrew 自体も php を使うので解除もできません

管理に php 自身を使うので別のツールなしでできていいな と思っていたのにこういう問題があるのですね……

% phpbrew --help
php: error while loading shared libraries: libreadline.so.6: cannot open shared object file: No such file or directory

とりあえず原因が phpbrew の php をみてることだろうと予測できたので /bin にある php をみるようにしてみます

% export PATH="/bin:$PATH"
% type php
php is /bin/php

標準の php を使うようにしたら無事動きました

phpbrew を動くように

このまま標準 php を使うなら問題ないですが phpbrew でバージョン選択できるようにしたいです

たぶんですが 古い環境でビルドしてインストールしたのでその頃の環境の libreadline.so.6 を参照しようとしてエラーになっています

対策は
  • 古い環境にあったはずの libreadline.so.6 を持ってくる
  • php を新しくビルドし直す

のどちらかでできそうな気がします

せっかく新しい環境にアップデートしたのに古いままのソフトのために古いライブラリを配置するのも気が進まないので新しくビルドし直してインストールすることにします
というのも 動かない phpbrew のバージョンはちょうど標準の php のバージョンより古いものでした

基本古いのを使うことはなくて 標準のバージョンより新しいのを使うために phpbrew を使っていたので この際古いのはアンインストールしてしまうことにしました

% phpbrew install 7.2

use だと一時的なので switch します
switch にしないともう一度 shell を開き直したらまた最初のエラーになります

% phpbrew switch 7.2.1

古いのは消しておきます

% phpbrew remove php-7.1.0

ところで

install だと 7.2 まで入力すれば 7.2.x の中で最新が自動で選ばれます
switch/use はフルバージョン名が必要です
remove になるとバージョン名に加えて php- のプレフィックスまで必要になります

install/use/switch は省略したらその中の最新で remove もバージョンのみでよくなればいいのですけど なんで揃ってないんでしょうね

あと確認のときの [Y/n] は入力も Y か n の必要があります
大文字はデフォルトって意味で yes だから y だと入力したらもう一度聞かれました
no のときの N もダメでした

細かいところで気が利かないんですね

さらにもうひとつ remove で消しても build/ と distfiles/ にファイルが残ります
clean というコマンドがあったのでやってみてもダメでした
消す前にやる必要があるとか remove じゃなく purge じゃないとダメとかなのかな?