猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

MacでHomebrewを使っていて、コマンドラインから叩くphpのバージョンがなんかおかしくなった場合の対処

概要

ある日 composer install するとこんな警告が出た

phpunit/phpunit 5.7.21 requires php ^5.6 || ^7.0 -> your PHP version (5.5.20) does not satisfy that requirement.

phpunit 5.7.21 を利用するには php5.6 以上または php7.0 以上が必要だが、あなたのPHPのバージョンは 5.5.20 です、というエラーだ。あれ、PHPは5.6をインストールしていたはずだと思って確認してみると…

$ php -v
PHP 5.5.20 (cli) (built: Feb 25 2015 23:30:53)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies

確かに5.5.20になっていた。

MacとHomebrewのバージョン

  • Mac OS 10.10.3 Yosemite
  • Homebrew 1.3.1-49-gdaa0ea4

brewで入れたphpはどこに入っているのか

僕以前に brew install php56 してPHPを入れていた。brewでいれたライブラリなどは /usr/local/Cellar に入っている。php56/usr/local/Cellar/php56 以下に入っている。

$ ls /usr/local/Cellar/php56
5.6.11_2/ 5.6.22/   5.6.31_7/

このPCには 5.6.11_2, 5.6.22, 5.6.31_7 の3つのバージョン*1が入っているようだ。

PHPのpathを確認して差し替える

今のPHPがどこから入れられたものなのか確認してみる。

$ which php
/usr/bin/php

$ ls -la /usr/bin/php
-rwxr-xr-x  1 root  wheel  9942272  2 26  2015 /usr/bin/php*

phpなどのコマンドは、大抵 /usr/bin/usr/local/bin に入っている。通常Homebrewで何かをインストールすると、 /usr/local/Cellar 以下に実体があり、 /usr/local/bin 以下から Cellar 以下にシンボリックリンクが貼られる形となるハズなのだが、この /usr/bin/phpシンボリックリンクではなく実体のようだ。そして /usr/local/bin/php が存在するかどうかを確認してみたが、こちらは存在しないようだった。とりあえずこの /usr/bin/php をなんとかしたい。 rm コマンドで消してしまっても良いのだが、安全のため名前を変更することにした。

$ sudo mv /usr/bin/php /usr/bin/php55

これでphpコマンドが一旦使えなくなる(かわるにphp55コマンドが使えるようになる)。あとは /usr/local/Cellar/php56 以下からシンボリックリンクを貼れば良い。今までは 5.6.22 を使っていたので、phpコマンドを叩くとこのバージョンのphpが呼ばれるようにする。

$ sudo ln -s /usr/local/Cellar/php56/5.6.22/bin/php /usr/local/bin/php
$ php -v
PHP 5.6.22 (cli) (built: Sep 30 2016 20:04:55)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

php5.6になった。これにより、composerもこのphpを使うようになるので、問題なく composer install が成功した。 *2

まとめ

Homebrewで入れたライブラリがどこに入っているのか、pathはどうなっているかを知っておくとこういった問題にすぐ対応できるので、ぜひ知っておきたい。

*1:正確にはphp5.6系のバージョン

*2:ちなみにphp5.6をbrewで再インストールしても、同様にシンボリックリンクが貼られると思うので、こちらの対処法でもよい。