macOS Sierraでbrew+php-build+mysql+apacheの環境を整える

OS X Mavericks (10.9) で開発環境を構築していたMacBookを、macOS Sierra (10.12) でクリーンインストールする必要に迫られた。

当時と比べ、PHPのバージョン管理はphpbrewなど乱立している感じだが、メンテされているものが少ない。

やはり、php-buildを使うことにした。

.
当時参考にしたのは以下の記事で、そのまま使えるものも多いため、今回もこれを参考に進めた。

PHPerがMacbookAirを買ったら直ぐにすること 2012
http://qiita.com/suin/items/26162a4ebcbbb351b879

Java SEのインストール

http://www.oracle.com/technetwork/java/javase/downloads/index.html
JDK Download をクリックしてOSに合ったものをダウンロード。
インストール後、java -version で確認。

XQuartzのインストール

https://www.xquartz.org
あとあと、PHP のビルド時に必要なライブラリ libpng を入れてくれるので、インストールしておく。(これを入れず brew install libpng したのをリンクしてPHPをビルドしようとしたら何故か上手く行かなかったので)

Xcodeのインストール

AppStoreから最新版(現時点8.3.2)をインストール。5GBくらいあるので時間が掛かる。

Xcode Command Line Toolsのインストール

Xcodeインストール後、起動、メニュー「Open Developer Tool」>
More Developer Tools > Apple Developer のサイトへ行き、
バージョンに合った Command Line Tools (.dmg) をダウンロードしてインストール。
https://stangler.blogspot.jp/2017/02/macos-sierra-xcode-command-line-tools_14.html

ホームディレクトリを確認する

ホームディレクトリとは /Users/[ユーザ名] のディレクトリのこと。Finder で「家」の形のアイコンが付いているフォルダ。自分のユーザ名は whoami コマンドで確認できる。ターミナルでは cd とだけ打ち込むとホームディレクトリに移動する、cd $HOME でも同じ。

.bash_profile / .bashrc を作る

.bash_profile と .bashrc は環境変数などを設定するファイル。.bash_profile はログイン時に一度だけ実行され、.bashrc はターミナルウィンドウを開くたびに実行される。

使い方は人それぞれだが、ここでは主に .bashrc に記述していくことにした。

もうちょっとちゃんとした使い分けは「本当に正しい .bashrc と .bash_profile の使ひ分け」を参照。

ホームディレクトリに .bash_profile と .bashrc を作る

cd
touch .bash_profile
touch .bashrc

この2つのファイルは、先頭に .(ドット)がついており隠しファイルなのでFinderを開いても見えない。ターミナルで ls すると見える。

vi ~/.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Homebrewのインストール

https://brew.sh/index_ja.html

Homebrew は Mac 用のパッケージ (Formula) 管理ツールで、Apple が用意してくれていない便利なものを色々入れることができる。Linux でいう yum コマンドのようなもの。大抵のものは brew search すれば見つかる。

まずインストール場所を決める。
Homebrew は従来では /usr/local/ などにインストールされていたが、Sierra (とEl Capitan) からは /usr/ といったシステム的に重要な場所の書き込みが制限されているらしく、それならばと、ホームディレクトリに brew の専用フォルダを作ってインストールすることにした。

開発関係のフォルダとしてホームに dev フォルダを作り、その下に brew フォルダを作る。(ずっと使うことになるため覚えやすい場所に決める)

まず dev フォルダを作る。

mkdir -p /Users/[ユーザ名]/dev

Tips : /Users/[ユーザ名] は $HOME と短く書くこともできる。

dev フォルダに移動

cd $HOME/dev

いざ、brew フォルダを作って、Homebrew をインストール

mkdir brew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C brew

.
終わったら、brew doctor と打ち込んで試してみる。
prefix がデフォルトでないというメッセージが出るが気にしない。任意の場所に作っているので当然。

.bashrc に brew で、これからインストールする用のパスを通しておく

vi ~/.bashrc
export PATH=${HOME}/dev/brew/bin:$PATH
export HOMEBREW_CACHE=${HOME}/dev/brew/cache

Homebrew で今後インストールされるパッケージ類のコマンドは、${HOME}/dev/brew/bin 下、つまり* /Users/[ユーザー名]/dev/brew/bin* にインストールされる。ので、パスを通しておく。

.bashrc を保存し終わったら、ターミナルウィンドウを開き直す。

brew のパッケージインストールを試す

ひとまずテストに、何かと使える wget コマンドを brew で入れてみる。

brew install wget

試してみる(www.yahoo.co.jp のソースがダウンロードされ表示される)

wget http://www.yahoo.co.jp

これは余談だが、パッケージの実体は、/Users/[ユーザ名]/dev/brew/Cellar に置かれ、wget コマンドは、/Users/[ユーザ名]/dev/brew/brew/bin に置かれる。

/Users/[ユーザ名]/dev/brew/brew/bin/wget にシンボリックリンクが作られ、/Users/[ユーザ名]/dev/brew/Cellar/wget/[インストールされたバージョン]/bin/wget にリンクされている。そして前もって、.bashrc でパスを通しているので、wget が直接コマンドとして機能するようになる。Macのエイリアスが二重になっている感じ。

なぜこんな回りくどいことになっているのかというと、もしリンクを張っていなければ

/Users/[ユーザ名]/dev/brew/Cellar/wget/[インストールされたバージョン]/bin/wget http://www.yahoo.co.jp

と、wget を使うたびに長いパスを入れなくてはいけない。

brew で Apache 2.2 をインストール

tap に追加して、httpd を探す

brew tap Homebrew/dupes
brew search httpd

2.2 をインストール

brew install httpd22

サイトのドキュメントルートを決める

従来の /Users/[ユーザ名]/Sites にしたいが、Sierra は Sites フォルダが用意されていなかった。
普通にフォルダを作ればOK。

mkdir -p $HOME/Sites

Sites が「サイト」じゃないのが気になったら、Sites ディレクトリ上で、touch .localized する。

Apacheで最低限の設定をする(書き換えが必要な箇所のみ)

vi $HOME/dev/brew/etc/apache2/2.2/httpd.conf
<Directory> の AllowOverride None / Order deny,allow / Deny from all はコメントアウトする。

Listen 80

ServerName localhost:80

User daemon -> User [自分のアカウント名]
Group daemon -> Group staff

DocumentRoot "/Users/[ユーザ名]/Sites"

<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

起動・再起動・停止を試す

sudo apachectl start
sudo apachectl restart
sudo apachectl stop

上手くいかない時、apacheのエラーログを見る。

tail $HOME/dev/brew/var/log/apache2/error_log

SSLのエラーが出ていたら、SSLのオプションを切ってもいい。

ホスト名に追加

sudo vi /etc/hosts

127.0.0.1       localhost      [ローカルホスト名]

※ローカルホスト名:システム環境設定>共有>コンピュータ名(編集ボタンを押す)で設定しているもの

Mime.types にPHPを追加

vi $HOME/dev/brew/etc/apache2/2.2/mime.types

application/x-httpd-php                         php

設定しないと、PHPスクリプトが実行されない。

brew で MySQL 5.5 をインストール

今回は 5.5 を使いたかったので探して入れる。

brew search mysql
brew install mysql@5.5

MySQL で最低限の設定をする

vi $HOME/dev/brew/etc/my.cnf

MySQLのパスを通す

vi ~/.bashrc

export PATH=${HOME}/dev/brew/opt/mysql@5.5/bin:$PATH

MySQL データディレクトリの権限設定

sudo chown -R _mysql:_mysql $HOME/dev/brew/var/mysql

起動・再起動・停止を試す

sudo mysql.server start
sudo mysql.server restart
sudo mysql.server stop

エラー ERROR! The server quit without updating PID file

上記の、データディレクトリの権限設定ができていない。

brew で php-build / php-version などの、PHPのビルド準備をする

php-build をインストール

バージョンを指定してPHPをビルドするもの。
新しめのバージョンのPHPをインストールできるように、–HEADをつけて最新のものを取ってくる。

brew install --HEAD homebrew/php/php-build

php-build を実行するときの、ビルドしたPHPのインストール場所を作っておく(PHPの実体が置かれる場所)

mkdir -p $HOME/dev/brew/php/versions

php-version をインストール

php-buildでバージョン毎に入れたPHPを切り替えるもの。

brew install homebrew/php/php-version

php-version のパスを通す

ここでは、PHP 5.6.30 を入れるつもりなので、デフォルトでは 5.6.30 が起動するようにしておく。(適宜、書き換えると良い)

vi ~/.bashrc
export PHP_VERSIONS=${HOME}/dev/brew/php/versions
[ -f $(brew --prefix php-version)/php-version.sh ] && source $(brew --prefix php-version)/php-version.sh && php-version 5.6.30 >/dev/null

PHPのビルドに必要と思われるパッケージ群をインストール

brew install re2c
brew install libjpeg
brew install libmcrypt
Brew install openssl
Brew install libxml2

ここで本来は libpng を入れる必要があるのだが、XQuartzが入れてくれているので大丈夫なはず。

bisonも入れておく

PHPに対応したバージョンが入っていないと、php-build 実行時に「configure: WARNING: bison versions supported for regeneration of the Zend/PHP parsers: 2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7 (found: 2.3).」のようなエラーが起きる。

brew search bison

2.7は対応してるので、これを使う

brew install bison@2.7

パスを通す

vi ~/.bashrc
export PATH=${HOME}/dev/brew/opt/bison@2.7/bin:$PATH

PHP 5.6 系を php-build でインストール

ようやく準備が整ったので、PHPをバージョン指定して入れていく。

php-build のバージョン毎のビルド設定ファイルは、$HOME/dev/brew/share/php-build/definitions/ に置かれている。今回は、5.6.30 を入れたいので、以下を開く。

vi $HOME/dev/brew/share/php-build/definitions/5.6.30

configure_option -R "--with-mysql" "mysqlnd"
configure_option "--with-apxs2" "/Users/[ユーザ名]/dev/brew/bin/apxs"
configure_option "--enable-phpdbg"
configure_option "--with-jpeg-dir" "$(brew --prefix libjpeg)"
configure_option "--with-mcrypt" "$(brew --prefix libmcrypt)"
configure_option "--with-openssl" "$(brew --prefix openssl)"
configure_option "--with-libxml-dir" "$(brew --prefix libxml2)"
install_package "https://secure.php.net/distributions/php-5.6.30.tar.bz2"
install_xdebug "2.5.2"
enable_builtin_opcache

最終的にはこのような感じになった。以下、変更した箇所について。

libphp5.so を生成させるため

configure_option "--with-apxs2" "/Users/[ユーザ名]/dev/brew/bin/apxs"

PHP5.6からのデバッガを入れてみたいので

configure_option "--enable-phpdbg"

ビルドに必要なライブラリのディレクトリを個別に指定。

configure_option "--with-jpeg-dir" "$(brew --prefix libjpeg)"
configure_option "--with-mcrypt" "$(brew --prefix libmcrypt)"
configure_option "--with-openssl" "$(brew --prefix openssl)"
configure_option "--with-libxml-dir" "$(brew --prefix libxml2)"

install_package はPHPのダウンロード元でURLが古いと見つからない場合があるので適宜書き換える。install_xdebug は開いたときのバージョンのままで問題ないはず。

また php-build は 0.11.0 より pear 及び pyrus のサポートを終了 (Removed pear and pyrus support)している。よって、install_pyrus は使えないので書かない。pear が必要な場合は、公式から別途入れることになる。

保存したら、ビルドを実行

先ほど作った保存先の $HOME/dev/brew/php/versions/ 以下にインストールさせる。

php-build 5.6.30 $HOME/dev/brew/php/versions/5.6.30

しばらく待つ。

終わったら、PHP 5.6.30 用に作られた libphp5.so (apacheが使う)を、5.6.30 の個別フォルダに退避しておく。
(退避しておいて、apache で使うPHPのバージョン毎に差し替えられるようにする)

cp $HOME/dev/brew/opt/httpd22/libexec/libphp5.so $HOME/dev/brew/php/versions/5.6.30/libphp5.so

php-versionで切り替えてみる

php-version 5.6.30
php -v

PHP 5.6.30 (cli) (built: ビルド日時) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.5.2, Copyright (c) 2002-2017, by Derick Rethans

こんな感じに表示されたらOK。

なお、php-version はターミナル上で実行される php のバージョンを切り替えるものなので、Apache で使う php のバージョンは次の手順で切り替える。

ApacheのPHPバージョン切替シェルスクリプトを作る

スクリプトは http://qiita.com/suin/items/26162a4ebcbbb351b879#apacheのphpモジュール切り替え用シェルスクリプトを作る を拝借する。

ホームディレクトリに自作シェルスクリプトを置くためのフォルダ /dev/bin を作る

mkdir -p $HOME/dev/bin

パスを通す。

vi ~/.bashrc
export PATH=${HOME}/dev/bin:$PATH

シェルスクリプト作成、内容を書き込んで保存

touch apache-php-version
chmod +x apache-php-version

apache-php-version用の環境変数を設定

apacheとphp(homebrewでインストールした各バージョン)のパスを通す。(libphp5.soのコピー元とコピー先を指定)

vi ~/.bashrc
export APACHE_PATH=${HOME}/dev/brew/opt/httpd22
export PHP_PATH=${HOME}/dev/brew/php/versions

試してみる(Apache を php 5.6.30 で起動する)

apache-php-version 5.6.30

最終的な .bashrc はこんな感じになった

vi ~/.bashrc

export PATH=${HOME}/dev/bin:$PATH

export PATH=${HOME}/dev/brew/bin:$PATH
export HOMEBREW_CACHE=${HOME}/dev/brew/cache

export PHP_VERSIONS=${HOME}/dev/brew/php/versions
[ -f $(brew --prefix php-version)/php-version.sh ] && source $(brew --prefix php-version)/php-version.sh && php-version 5.6.30 >/dev/null

export PATH=${HOME}/dev/brew/opt/openssl/bin:$PATH

export PATH=${HOME}/dev/brew/opt/mysql@5.5/bin:$PATH

export PATH=${HOME}/dev/brew/opt/bison@2.7/bin:$PATH

export APACHE_PATH=${HOME}/dev/brew/opt/httpd22

export PHP_PATH=${HOME}/dev/brew/php/versions

おわりに

今だとVagrantとか使って仮想環境つくるのが当然みたいな雰囲気なんですが、従来のやり方も必要だろうと備忘録としてまとめてみました。

(突然、MavericksからSierraへすっ飛びでクリーンインストールからPHP環境構築するハメになり困ったので)

それはそれとして、疲れました。ふぅ。

抜けがあるような気がしないでもないので、また今度訂正します

0 件のコメント :

PAGE TOP