mac環境にPHPを導入、管理するにはphpbrewという便利なツールがあり大変便利です。
今回手元のMacにphpbrewを導入しましたため、ログを残します。

また、逆引きを追記いたしました。 ぜひご活用ください。

目的

Macにphp-fpm + nginxを導入してLaravel5.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

yumと違って、最初からインストールされているもではない(!)ため、コマンドを打ってインストールしましょう。

上記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ディレクトリが生成されます。
これをロードされるように次のコマンドを打ち、.bashrc.bash_profileにパスを追記します。

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

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

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

smallにはPDOやmbstringも含まれておりませんね。
defaultには必要なものがほぼ揃っておりますから、defaultに必要なライブラリを点々と足して行くのが良さそうです。

私はDBにMySQLを利用すること、php-fpmを利用することからvariantsは[ +default +mysql +fpm ]というようにしました。

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 install ]だけではなく[ 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

この記事の著者 Webrow (うぇぶろう)
Web アプリ開発、 Web 顧問 エンジニア、WordPress サポートいたします。