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でした。

$ php -v
PHP 5.6.25 (cli) (built: Sep 19 2016 15:45:41)
Copyright (c) 1997-2016 The PHP Group
Zend 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です。

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

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

ライブラリの更新

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

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

$ brew install bzip2 curl intltool icu4c libxml2 mcrypt openssl readline zlib
$ brew link bzip2 --force
$ brew link curl --force
$ brew link icu4c --force
$ brew link libxml2 --force
$ brew link mcrypt --force
$ brew link openssl --force
$ brew link zlib --force

正常ルート

phpbrewのインストール

まずはphpbrewをDLします。

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

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

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

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

$ phpbrew
  ______ _   _ ____________
  | ___ \ | | || ___ \ ___ \
  | |_/ / |_| || |_/ / |_/ /_ __ _____      __
  |  __/|  _  ||  __/| ___ \ '__/ _ \ \ /\ / /
  | |   | | | || |   | |_/ / | |  __/\ V  V /
  \_|   \_| |_/\_|   \____/|_|  \___| \_/\_/

Brew your latest php!

SYNOPSIS
    phpbrew [options] <command>

OPTIONS
    -v, --verbose
        Print verbose message.

    -d, --debug
        Print debug message.

    -q, --quiet
        Be quiet.

    -h, --help
        Show help.

    --version
        Show version.

    -p, --profile
        Display timing and memory usage information.

    --log-path=[<value>]
        The path of a log file.

    --no-interact
        Do not ask any interactive question.

    --no-progress
        Do not display progress bar.


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.
                 fpm    fpm commands
            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

TOPICS
                                  contribution    Contribution
                                      cookbook    Cookbook
                                          home    Home
        migrating-from-homebrew-php-to-phpbrew    Migrating from homebrew php to phpbrew
                                    phpbrew-ja    PHPBrew JA 日語指引
                               release-process    Release Process
                                   requirement    Requirement
                      setting-up-configuration    Setting up Configuration
                               troubleshooting    Troubleshooting

HELP
    'phpbrew help' lists available subcommands and some topics. See
    'phpbrew help <command>' or 'phpbrew help <topic>' to read about a
    specific subcommand or phpbrew.

phpbrew 1.22.6      powered by https://github.com/c9s/CLIFramework

設定

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

$ phpbrew init
Using root: /Users/[user_name]/.phpbrew
Initialization successfully finished!
<=====================================================>
Phpbrew environment is initialized, required directories are created under

    /Users/[user_name]/.phpbrew

Paste the following line(s) to the end of your ~/.bashrc and start a
new shell, phpbrew should be up and fully functional from there:

    source /Users/[user_name]/.phpbrew/bashrc

To enable PHP version info in your shell prompt, please set PHPBREW_SET_PROMPT=1
in your `~/.bashrc` before you source `~/.phpbrew/bashrc`

    export PHPBREW_SET_PROMPT=1

To enable .phpbrewrc file searching, please export the following variable:

    export PHPBREW_RC_ENABLE=1


For further instructions, simply run `phpbrew` to see the help message.

Enjoy phpbrew at $HOME!!

<=====================================================>

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

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

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

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

$ phpbrew known
===> Fetching release list...
Downloading https://secure.php.net/releases/index.php?json&version=7&max=100 via curl extension
Downloading https://secure.php.net/releases/index.php?json&version=5&max=100 via curl extension
7.1: 7.1.0 ...
7.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 ...
5.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 ...
5.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 ...
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 ...

configureオプション

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

$ phpbrew variants
Variants:
  all, apxs2, bcmath, bz2, calendar, cgi, cli, ctype, curl, dba, debug, dom,
  dtrace, editline, embed, exif, fileinfo, filter, fpm, ftp, gcov, gd,
  gettext, gmp, hash, iconv, icu, imap, inifile, inline, intl, ipc, ipv6,
  json, kerberos, libgcc, mbregex, mbstring, mcrypt, mhash, mysql, opcache,
  openssl, pcntl, pcre, pdo, pgsql, phar, phpdbg, posix, readline, session,
  soap, sockets, sqlite, static, tidy, tokenizer, wddx, xml, xml_all, xmlrpc,
  zip, zlib, zts


Virtual variants:
  dbs: sqlite, mysql, pgsql, pdo
  mb: mbstring, mbregex
  neutral:
  small: bz2, cli, dom, filter, ipc, json, mbregex, mbstring, pcre, phar,
  posix, readline, xml, curl, openssl
  default: bcmath, bz2, calendar, cli, ctype, dom, fileinfo, filter, ipc,
  json, mbregex, mbstring, mhash, mcrypt, pcntl, pcre, pdo, phar, posix,
  readline, sockets, tokenizer, xml, curl, openssl, zip
  everything: dba, ipv6, dom, calendar, wddx, static, inifile, inline, cli,
  ftp, filter, gcov, zts, json, hash, exif, mbstring, mbregex, libgcc,
  pdo, posix, embed, sockets, debug, phpdbg, zip, bcmath, fileinfo, ctype,
  cgi, soap, pcntl, phar, session, tokenizer, opcache, imap, tidy, kerberos,
  xmlrpc, fpm, dtrace, pcre, mhash, mcrypt, zlib, curl, readline, editline,
  gd, intl, icu, openssl, mysql, sqlite, pgsql, xml, xml_all, gettext,
  iconv, bz2, ipc, gmp


Using variants to build PHP:

  phpbrew install php-5.3.10 +default
  phpbrew install php-5.3.10 +mysql +pdo
  phpbrew install php-5.3.10 +mysql +pdo +apxs2
  phpbrew install php-5.3.10 +mysql +pdo +apxs2=/usr/bin/apxs2

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

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

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

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

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

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

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

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

$ phpbrew install php-7.0.14 +default +mysql +fpm
===> phpbrew will now build 7.0.14
===> Loading and resolving variants...
homebrew prefix '' doesn't exist. you forgot to install?
Checking distribution checksum...
Checksum matched: 903ff1fd199201d7e69dc0963797072b
===> Distribution file was successfully extracted, skipping...
Found existing Makefile, running make clean to ensure everything will be rebuilt.
You can append --no-clean option after the install command if you don't want to rebuild.
===> Running make clean: /usr/bin/make -C '/Users/[user_name]/.phpbrew/build/php-7.0.14' --quiet 'clean'
===> Checking patches...
Checking patch for replace apache php module name with custom version name
Found existing build.log, renaming it to /Users/[user_name]/.phpbrew/build/php-7.0.14/build.log.1482965926
===> Configuring 7.0.14...


Use tail command to see what's going on:
   $ tail -F /Users/[user_name]/.phpbrew/build/php-7.0.14/build.log


===> Checking patches...
Checking patch for php5.3.29 multi-sapi patch.
Checking patch for php5.3.x on 64bit machine when intl is enabled.
Checking patch for openssl dso linking patch
6 changes patched.
===> Building...
Build finished: 12.4 minutes.
Installing...
---> Creating php-fpm.conf
---> Found /Users/[user_name]/.phpbrew/php/php-7.0.14/etc/php-fpm.d/www.conf
---> Patching default fpm pool listen path to /Users/[user_name]/.phpbrew/php/php-7.0.14/var/run/php-fpm.sock
---> Creating php.ini
---> Copying /Users/[user_name]/.phpbrew/build/php-7.0.14/php.ini-development
Found existing /Users/[user_name]/.phpbrew/php/php-7.0.14/etc/php.ini.
---> Found date.timezone is not set, patching...
Congratulations! Now you have PHP with 7.0.14 as php-7.0.14

* We found that you enabled 'mysql' variant, you might need to setup your
  'pdo_mysql.default_socket' or 'mysqli.default_socket' in your php.ini file.

* To configure your installed PHP further, you can edit the config file at
    /Users/[user_name]/.phpbrew/php/php-7.0.14/etc/php.ini

* WARNING:
  You haven't setup your .bashrc file to load phpbrew shell script yet!
  Please run 'phpbrew init' to see the steps!

To use the newly built PHP, try the line(s) below:

    $ phpbrew use php-7.0.14

Or you can use switch command to switch your default php to php-7.0.14:

    $ phpbrew switch php-7.0.14

Enjoy!

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

$ phpbrew switch 7.0.14

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

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

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

異常ルート

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

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

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

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

$ openssl version
OpenSSL 0.9.8zh 14 Jan 2016

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

$ brew install openssl
$ brew link openssl --force

以下同文、、、

  • bzip
configure: error: Please reinstall the BZip2 distribution
  • curl
configure: error: Please reinstall the libcurl distribution -

    easy.h should be in <curl-dir>/include/curl/
  • mcrypt
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
  • readline
configure: error: Please reinstall readline - I cannot find readline.h
  • zlib
checking 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中に、以下のようにビルドが失敗するケースがありました。

===> Building...
Error: Make failed:
The last 5 lines in the log file:
  "_rl_pending_input", referenced from:

      _zif_readline_info in readline.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [sapi/cli/php] Error 1

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

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

$ brew install intltool icu4c libxml2 openssl
$ brew link icu4c --force
$ brew link libxml2 --force
$ brew link openssl --force

このエラーが発生している場合は[ brew install ]だけではなく[ brew link ]まで実行してるかどうかご確認ください。

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

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

$ phpbrew known
===> Fetching release list...
Downloading https://secure.php.net/releases/index.php?json&version=7&max=100 via curl extension
Downloading https://secure.php.net/releases/index.php?json&version=5&max=100 via curl extension

Warning: 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
Exception: Can't store release json file
Trace:

    0) PhpBrew\ReleaseList->save()
    1) PhpBrew\ReleaseList->fetchRemoteReleaseList(GetOptionKit\OptionResult)
    2) PhpBrew\Tasks\FetchReleaseListTask->fetch()
    3) PhpBrew\Command\KnownCommand->execute()
    4) call_user_func_array([PhpBrew\Command\KnownCommand, 'execute'], [])
    5) CLIFramework\CommandBase->executeWrapper([])
    6) CLIFramework\Application->run(['/usr/local/bin/phpbrew', 'known'])
    7) PhpBrew\Console->runWithTry(['/usr/local/bin/phpbrew', 'known'])
    8) require('phar:///usr/local/bin/phpbrew/scripts/phpbrew-emb.php')

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

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

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

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

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

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


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

$ phpbrew use 7.0.14
Exception: build 7.0.14 doesn't exist.
Trace:

    0) PhpBrew\Command\UseCommand->execute('7.0.14')
    1) call_user_func_array([PhpBrew\Command\UseCommand, 'execute'], ['7.0.14'])
    2) CLIFramework\CommandBase->executeWrapper(['7.0.14'])
    3) CLIFramework\Application->run(['/usr/local/bin/phpbrew', 'use', '7.0.14'])
    4) PhpBrew\Console->runWithTry(['/usr/local/bin/phpbrew', 'use', '7.0.14'])
    5) require('phar:///usr/local/bin/phpbrew/scripts/phpbrew-emb.php')

PDOでエラー

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

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

こんな感じです。

$ php -i | grep PDO
PDO
PDO support => enabled
PDO drivers no value

phpbrewが全く実行できない

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

$ phpbrew install php-7.0.14 +pdo +mysql

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

PHP 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
Stack trace:

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

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

$ phpbrew off

おわりに

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

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


参考サイト

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

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

スポンサーリンク
ad_336
ad_336
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存