今回手持ちの Mac に PHPBrew を導入しましたため、作業ログを残します。

PHPBrew

PHPBrew は Mac の PHP 管理ツールです。

複数の PHP バージョンを用意して、簡単にスイッチすることができ大変便利です。

目的

Mac にphp-fpm + nginx を導入して Laravel 5.3 を動かす。

なお、導入にあたって次のサイトの通りインストール作業を行いました。

karakaram-blog - MacでのPHP開発はphpbrewが非常に良い
http://www.karakaram.com/mac-install-phpbrew

環境

  • ほぼまっさらなMacBook (12inch)
  • macOS sierra

PHPBrew 導入前の PHP バージョンは 5.6 でした。

1$ php -v
2PHP 5.6.25 (cli) (built: Sep 19 2016 15:45:41)
3Copyright (c) 1997-2016 The PHP Group
4Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

導入

前準備

Homebrew

Homebrew は Mac 用のパッケージマネージャーです。
ようするに Mac 版 yum です。

Homebrew
http://brew.sh/index_ja.html

初期インストール品ではないため、コマンドを打ってインストールしましょう。

上記 URL に記載されている通り、次をターミナル上で実行すれば OK です。

1$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

インストール完了までしばらく待ちましょう。

ライブラリの更新

PHP インストールを進めて行くと「ライブラリが無い」と何回も叱られてしまいます。
「エラーが出て、パッケージを追加インストールして」の繰り返しで環境構築は遅々として進まないものですね。

事前に必要なパッケージのインストールを済ませておくのがベターです。
私は以下を事前に導入しました。

1$ brew install bzip2 curl intltool icu4c libxml2 mcrypt openssl readline zlib
2$ brew link bzip2 --force
3$ brew link curl --force
4$ brew link icu4c --force
5$ brew link libxml2 --force
6$ brew link mcrypt --force
7$ brew link openssl --force
8$ brew link zlib --force

正常ルート

PHPBrew のインストール

まずは PHPBrew を DL します。

1$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
2% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
3                               Dload  Upload   Total   Spent    Left  Speed
4100   130  100   130    0     0     93      0  0:00:01  0:00:01 --:--:--    95
5100 1793k  100 1793k    0     0   307k      0  0:00:05  0:00:05 --:--:--  414k

これに実行権限を与え、パスが通ったディレクトリに移動します。

1$ chmod +x phpbrew
2$ sudo mkdir /usr/local/bin
3$ sudo mv phpbrew /usr/local/bin/phpbrew

これでインストールは完了です。 コマンドを打って実行確認しましょう。

 1$ phpbrew
 2  ______ _   _ ____________
 3  | ___ \ | | || ___ \ ___ \
 4  | |_/ / |_| || |_/ / |_/ /_ __ _____      __
 5  |  __/|  _  ||  __/| ___ \ '__/ _ \ \ /\ / /
 6  | |   | | | || |   | |_/ / | |  __/\ V  V /
 7  \_|   \_| |_/\_|   \____/|_|  \___| \_/\_/
 8
 9Brew your latest php!
10
11SYNOPSIS
12	phpbrew [options] <command>
13
14OPTIONS
15	-v, --verbose
16		Print verbose message.
17
18	-d, --debug
19		Print debug message.
20
21	-q, --quiet
22		Be quiet.
23
24	-h, --help
25		Show help.
26
27	--version
28		Show version.
29
30	-p, --profile
31		Display timing and memory usage information.
32
33	--log-path=[<value>]
34		The path of a log file.
35
36	--no-interact
37		Do not ask any interactive question.
38
39	--no-progress
40		Do not display progress bar.
41
42
43COMMANDS
44                help    Show help message of a command
45                 app    php app store
46                init    Initialize phpbrew config file.
47               known    List known PHP versions
48             install    Install php
49                list    List installed PHPs
50                 use    Use php, switch version temporarily
51              switch    Switch default php version.
52                each    Iterate and run a given command over all php versions managed by PHPBrew.
53              config    Edit your current php.ini in your favorite $EDITOR
54                info    Show current php information
55                 env    Export environment variables
56           extension    List extensions or execute extension subcommands
57            variants    List php variants
58                path    Show paths of the current PHP.
59                  cd    Change to directories
60            download    Download php
61               clean    Clean up the source directory of a PHP distribution
62              update    Update PHP release source file
63               ctags    Run ctags at current php source dir for extension development.
64                 fpm    fpm commands
65            list-ini    List loaded ini config files.
66         self-update    Self-update, default to master version
67              remove    Remove installed php build.
68               purge    Remove installed php version and config files.
69                 off    Temporarily go back to the system php
70          switch-off    Definitely go back to the system php
71
72TOPICS
73                                  contribution    Contribution
74                                      cookbook    Cookbook
75                                          home    Home
76        migrating-from-homebrew-php-to-phpbrew    Migrating from homebrew php to phpbrew
77                                    phpbrew-ja    PHPBrew JA 日語指引
78                               release-process    Release Process
79                                   requirement    Requirement
80                      setting-up-configuration    Setting up Configuration
81                               troubleshooting    Troubleshooting
82
83HELP
84	'phpbrew help' lists available subcommands and some topics. See
85	'phpbrew help <command>' or 'phpbrew help <topic>' to read about a
86	specific subcommand or phpbrew.
87
88phpbrew 1.22.6		powered by https://github.com/c9s/CLIFramework

設定

インストール直後は直後は init コマンドを打ちます。

 1$ phpbrew init
 2Using root: /Users/[user_name]/.phpbrew
 3Initialization successfully finished!
 4<=====================================================>
 5Phpbrew environment is initialized, required directories are created under
 6
 7    /Users/[user_name]/.phpbrew
 8
 9Paste the following line(s) to the end of your ~/.bashrc and start a
10new shell, phpbrew should be up and fully functional from there:
11
12    source /Users/[user_name]/.phpbrew/bashrc
13
14To enable PHP version info in your shell prompt, please set PHPBREW_SET_PROMPT=1
15in your `~/.bashrc` before you source `~/.phpbrew/bashrc`
16
17    export PHPBREW_SET_PROMPT=1
18
19To enable .phpbrewrc file searching, please export the following variable:
20
21    export PHPBREW_RC_ENABLE=1
22
23
24For further instructions, simply run `phpbrew` to see the help message.
25
26Enjoy phpbrew at $HOME!!
27
28<=====================================================>

HOME 直下に .phpbrew ディレクトリが生成されます。
これをロードされるように次のコマンドを打ちましょう。

1$ echo "source $HOME/.phpbrew/bashrc" >> ~/.bashrc

.bash_profile にパスを追記するのでも OK です。

インストール可能なバージョンを確認する

phpbrew known を打つと、インストール可能なバージョンが出力されます。

1$ phpbrew known
2===> Fetching release list...
3Downloading https://secure.php.net/releases/index.php?json&version=7&max=100 via curl extension
4Downloading https://secure.php.net/releases/index.php?json&version=5&max=100 via curl extension
57.1: 7.1.0 ...
67.0: 7.0.14, 7.0.13, 7.0.12, 7.0.11, 7.0.10, 7.0.9, 7.0.8, 7.0.7 ...
75.6: 5.6.29, 5.6.28, 5.6.27, 5.6.26, 5.6.25, 5.6.24, 5.6.23, 5.6.22 ...
85.5: 5.5.38, 5.5.37, 5.5.36, 5.5.35, 5.5.34, 5.5.33, 5.5.32, 5.5.31 ...
95.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 ...

configure オプション

phpbrew variants コマンド打って、インストール可能なライブラリを確認します。

 1$ phpbrew variants
 2Variants:
 3  all, apxs2, bcmath, bz2, calendar, cgi, cli, ctype, curl, dba, debug, dom,
 4  dtrace, editline, embed, exif, fileinfo, filter, fpm, ftp, gcov, gd,
 5  gettext, gmp, hash, iconv, icu, imap, inifile, inline, intl, ipc, ipv6,
 6  json, kerberos, libgcc, mbregex, mbstring, mcrypt, mhash, mysql, opcache,
 7  openssl, pcntl, pcre, pdo, pgsql, phar, phpdbg, posix, readline, session,
 8  soap, sockets, sqlite, static, tidy, tokenizer, wddx, xml, xml_all, xmlrpc,
 9  zip, zlib, zts
10
11
12Virtual variants:
13  dbs: sqlite, mysql, pgsql, pdo
14  mb: mbstring, mbregex
15  neutral:
16  small: bz2, cli, dom, filter, ipc, json, mbregex, mbstring, pcre, phar,
17  posix, readline, xml, curl, openssl
18  default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc,
19  json, mbregex, mbstring, mhash, mcrypt, pcntl, pcre, pdo, phar, posix,
20  readline, sockets, tokenizer, xml, curl, openssl, zip
21  everything: dba, ipv6, dom, calendar, wddx, static, inifile, inline, cli,
22  ftp, filter, gcov, zts, json, hash, exif, mbstring, mbregex, libgcc,
23  pdo, posix, embed, sockets, debug, phpdbg, zip, bcmath, fileinfo, ctype,
24  cgi, soap, pcntl, phar, session, tokenizer, opcache, imap, tidy, kerberos,
25  xmlrpc, fpm, dtrace, pcre, mhash, mcrypt, zlib, curl, readline, editline,
26  gd, intl, icu, openssl, mysql, sqlite, pgsql, xml, xml_all, gettext,
27  iconv, bz2, ipc, gmp
28
29
30Using variants to build PHP:
31
32  phpbrew install php-5.3.10 +default
33  phpbrew install php-5.3.10 +mysql +pdo
34  phpbrew install php-5.3.10 +mysql +pdo +apxs2
35  phpbrew install php-5.3.10 +mysql +pdo +apxs2=/usr/bin/apxs2

Variants がライブラリ単体、 Virtual variants がライブラリグループを指します。

例えば +small を指定すれば以下がインストールされます。

1small: bz2, cli, dom, filter, ipc, json, mbregex, mbstring, pcre, phar,
2posix, readline, xml, curl, openssl

default には必要なものがほぼ揃っていますが、small は PDO や mbstring もなくてい、本当に最小構成ですねー。

大方のケースでは default に必要なライブラリを点々と足して行くのが良さそうです。

私は DB に MySQL を利用すること、php-fpm を利用することから variants は次としました。

1$ phpbrew install php-7.0.14 +default +mysql +fpm

インストールとバージョンの切り替え

先ほどのコマンドを実行し、インストールを進めましょう。

 1$ phpbrew install php-7.0.14 +default +mysql +fpm
 2===> phpbrew will now build 7.0.14
 3===> Loading and resolving variants...
 4homebrew prefix '' doesn't exist. you forgot to install?
 5Checking distribution checksum...
 6Checksum matched: 903ff1fd199201d7e69dc0963797072b
 7===> Distribution file was successfully extracted, skipping...
 8Found existing Makefile, running make clean to ensure everything will be rebuilt.
 9You can append --no-clean option after the install command if you don't want to rebuild.
10===> Running make clean: /usr/bin/make -C '/Users/[user_name]/.phpbrew/build/php-7.0.14' --quiet 'clean'
11===> Checking patches...
12Checking patch for replace apache php module name with custom version name
13Found existing build.log, renaming it to /Users/[user_name]/.phpbrew/build/php-7.0.14/build.log.1482965926
14===> Configuring 7.0.14...
15
16
17Use tail command to see what's going on:
18   $ tail -F /Users/[user_name]/.phpbrew/build/php-7.0.14/build.log
19
20
21===> Checking patches...
22Checking patch for php5.3.29 multi-sapi patch.
23Checking patch for php5.3.x on 64bit machine when intl is enabled.
24Checking patch for openssl dso linking patch
256 changes patched.
26===> Building...
27Build finished: 12.4 minutes.
28Installing...
29---> Creating php-fpm.conf
30---> Found /Users/[user_name]/.phpbrew/php/php-7.0.14/etc/php-fpm.d/www.conf
31---> Patching default fpm pool listen path to /Users/[user_name]/.phpbrew/php/php-7.0.14/var/run/php-fpm.sock
32---> Creating php.ini
33---> Copying /Users/[user_name]/.phpbrew/build/php-7.0.14/php.ini-development
34Found existing /Users/[user_name]/.phpbrew/php/php-7.0.14/etc/php.ini.
35---> Found date.timezone is not set, patching...
36Congratulations! Now you have PHP with 7.0.14 as php-7.0.14
37
38* We found that you enabled 'mysql' variant, you might need to setup your
39  'pdo_mysql.default_socket' or 'mysqli.default_socket' in your php.ini file.
40
41* To configure your installed PHP further, you can edit the config file at
42    /Users/[user_name]/.phpbrew/php/php-7.0.14/etc/php.ini
43
44* WARNING:
45  You haven't setup your .bashrc file to load phpbrew shell script yet!
46  Please run 'phpbrew init' to see the steps!
47
48To use the newly built PHP, try the line(s) below:
49
50    $ phpbrew use php-7.0.14
51
52Or you can use switch command to switch your default php to php-7.0.14:
53
54    $ phpbrew switch php-7.0.14
55
56Enjoy!

インストール完了後、追加コマンドを打って有効なバージョンを切り替えます。

1$ phpbrew switch 7.0.14

さて、バージョンを確認してみましょう。

1$ php -v
2PHP 7.0.14 (cli) (built: Dec 29 2016 07:57:18) ( NTS )
3Copyright (c) 1997-2016 The PHP Group
4Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
1$ which php
2/Users/[user_name]/.phpbrew/php/php-7.0.14/bin/php

しっかりバージョンが上がっています。
お疲れ様でした。

異常ルート

ライブラリ/ヘッダファイルが見つからない

最初のエラーは以下でした。

1configure: error: Cannot find OpenSSL's <evp.h>

とりあえずバージョン確認のコマンドを打ってみます。

1$ openssl version
2OpenSSL 0.9.8zh 14 Jan 2016

OpenSSLはインストールされていますが、なかなかにバージョンが古いですね。
おそらく、目的のファイルが存在しないバージョンと考えられますから、brewで新しいOpenSSLをインストールしましょう。

1$ brew install openssl
2$ brew link openssl --force

以下同文、、、

  • bzip

    1configure: error: Please reinstall the BZip2 distribution
  • curl

    1configure: error: Please reinstall the libcurl distribution -
    2
    3easy.h should be in <curl-dir>/include/curl/
  • mcrypt

    1configure: error: mcrypt.h not found. Please reinstall libmcrypt.
  • readline

    1configure: error: Please reinstall readline - I cannot find readline.h
  • zlib

    1checking for the location of zlib... configure: error: zip support requires ZLIB. Use --with-zlib-dir=<DIR> to specify prefix where ZLIB include and library are located

linker command failed

phpbrew install 中に、以下のようにビルドが失敗するケースがありました。

 1===> Building...
 2Error: Make failed:
 3The last 5 lines in the log file:
 4  "_rl_pending_input", referenced from:
 5
 6      _zif_readline_info in readline.o
 7
 8ld: symbol(s) not found for architecture x86_64
 9
10clang: error: linker command failed with exit code 1 (use -v to see invocation)
11
12make: *** [sapi/cli/php] Error 1

これも必須ライブラリが環境にインストールされていないために発生するようです。

具体的にこれ、というのはわからなかったのですが、私のケースでは上記エラー発生後に以下を実行することで解消しました。

1$ brew install intltool icu4c libxml2 openssl
2$ brew link icu4c --force
3$ brew link libxml2 --force
4$ brew link openssl --force

このエラーが発生する場合、 brew link まで実行してるかどうかご確認ください。

.phpbrew が見つからない、その1

「 .phpbrew ディレクトリが無いよ」と叱られてしまいましたが、そもそも phpbrew init を実行していないだけでした。恥ずかしい。

 1$ phpbrew known
 2===> Fetching release list...
 3Downloading https://secure.php.net/releases/index.php?json&version=7&max=100 via curl extension
 4Downloading https://secure.php.net/releases/index.php?json&version=5&max=100 via curl extension
 5
 6Warning: file_put_contents(/Users/[user_name]/.phpbrew/php-releases.json): failed to open stream: No such file or directory in phar:///usr/local/bin/phpbrew/src/PhpBrew/ReleaseList.php on line 129
 7Exception: Can't store release json file
 8Trace:
 9
10    0) PhpBrew\ReleaseList->save()
11    1) PhpBrew\ReleaseList->fetchRemoteReleaseList(GetOptionKit\OptionResult)
12    2) PhpBrew\Tasks\FetchReleaseListTask->fetch()
13    3) PhpBrew\Command\KnownCommand->execute()
14    4) call_user_func_array([PhpBrew\Command\KnownCommand, 'execute'], [])
15    5) CLIFramework\CommandBase->executeWrapper([])
16    6) CLIFramework\Application->run(['/usr/local/bin/phpbrew', 'known'])
17    7) PhpBrew\Console->runWithTry(['/usr/local/bin/phpbrew', 'known'])
18    8) require('phar:///usr/local/bin/phpbrew/scripts/phpbrew-emb.php')

.phpbrew が見つからない、その2

1$ phpbrew switch 7.0.14
2You 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.

switch で上のエラーが出た場合、~/.phpbrew/bashrc のロードに失敗しております。

以下を実行して、ターミナルを再起動してください。

1$ echo "source $HOME/.phpbrew/bashrc" >> ~/.bashrc

それでも解決しない場合は、~/.bashrc がロードされていないかもしれません。


以下も ~/.phpbrew/bashrc のロードに失敗している場合に発生するエラーのようです。

 1$ phpbrew use 7.0.14
 2Exception: build 7.0.14 doesn't exist.
 3Trace:
 4
 5    0) PhpBrew\Command\UseCommand->execute('7.0.14')
 6    1) call_user_func_array([PhpBrew\Command\UseCommand, 'execute'], ['7.0.14'])
 7    2) CLIFramework\CommandBase->executeWrapper(['7.0.14'])
 8    3) CLIFramework\Application->run(['/usr/local/bin/phpbrew', 'use', '7.0.14'])
 9    4) PhpBrew\Console->runWithTry(['/usr/local/bin/phpbrew', 'use', '7.0.14'])
10    5) require('phar:///usr/local/bin/phpbrew/scripts/phpbrew-emb.php')

PDO でエラー

最初のインストール時は phpbrew install php-7.0.14 と、 Variants を一切指定せずに見事にどハマりしました。

Laravel を動かそうとしたところ、DB に接続できないと PDO でエラーが発生。
phpinfo() を出力してみると「 PDO は有効ですが、ドライバが空っぽ」の状態になっていました。

こんな感じです。

1$ php -i | grep PDO
2PDO
3PDO support => enabled
4PDO drivers	no value

PHPBrew が全く実行できない

上の失敗ではまだ Variants の意味がわかっておらず、次に下のように PDO をインストールしました。

1$ phpbrew install php-7.0.14 +pdo +mysql

インストール後、これでも解決せず、さらに次のエラーとなってしまいました。

1PHP Fatal error:  Uncaught RuntimeException: PHP's json extension is required to use Monolog's NormalizerFormatter in /path/to/project/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php:34
2Stack trace:

+json しておりませんでしたため、このままでは JSON が解析できません。
これは本当に詰んだと思いました。

このような状態に陥った場合は PHPBrew を停止し、素の PHP に戻して phpbrew install をやり直すしかなさそうです。

1$ phpbrew off

逆引き

こんな時どうするの ? これだけ知っておけば OK な内容ををまとめました。

インストール可能なバージョンを知りたい

1$ phpbrew known

インストール可能なバージョンリストを更新したい

1$ phpbrew update

インストール済みのバージョンを知りたい

1$ phpbrew list

新しい PHP バージョンを入手したい

1$ phpbrew install php-x.xx [options]

PHP バージョンを切り替えたい

1$ phpbrew switch php-x.x.x

use は一時的なバージョンの変更です。

利用可能な拡張ライブラリを知りたい

1$ phpbrew ext

拡張ライブラリをインストールしたい

1$ phpbrew ext install [package]

おわりに

PHPBrew はインストールもバージョンの切り替えも簡単で、オススメです!

しかしまあ PHPBrew に限らず、環境構築系は壁の連続であり、途中で目的が見失ってしまうことが多々あり、しんどいですね。
有効な解決方法をサクッと見つけて、さっさとコーディングに取り掛かりましょう!


初めてのPHP

David Sklar
出版社:オライリージャパン  発売日:2017-03-18

Amazonで詳細を見る

WEB+DB PRESS Vol.96

大和田 純,池田 翔,佐伯 孝尚,山口 智宏,武井 悠人,山本 幸生,尾川 順子,岡田 達明,栗林 健太郎,卜部 昌平,藤本 真樹,藤井 太洋,伊藤 直也,久田 真寛,のざき ひろふみ,うらがみ,うさみ けんた,わかめ まさひろ,久保 達彦,星野 将,遠藤 雅伸,ひげぽん,海野 弘成,はまちや2,竹原,粕谷 大輔,倉岡 洋義
出版社:技術評論社  発売日:2016-12-23

Amazonで詳細を見る

参考サイト

karakaram-blog - MacでのPHP開発はphpbrewが非常に良い
http://www.karakaram.com/mac-install-phpbrew

qiitq - phpbrew installでビルド関係のエラーが出るとき
http://qiita.com/daikingca2/items/0c89656eb934ae279bf0