MacでPHP開発するための最初の一歩!Homebrewを使った設定方法

このエントリーをはてなブックマークに追加

大好きな自転車で、大好きなすた丼を食べに行くのが喜びのサーバーサイドエンジニア、きんです。前職ではWindowsでJavaを書いていましたが、今後MacでPHPを書いていくことになりました。

ビットエーのエンジニアはWindowsで開発している人が多いので、備忘録としてMacでの方法をまとめてみました。

概要

PHP、MySQL、Apache の環境設定を管理された形でやるのは少し考えないと面倒です。Macには PHP と Apache がデフォルトでインストールされているので、かえってややこしくなっています。ざっとこんな方法があるのではないでしょうか。

  • XAMPP、MAMPなどの専用アプリケーションを利用する
  • MySQLだけをインストールし、OSに入っているApache、PHPを利用する
  • Homebrewで他のプログラムと一緒にPHP、MySQLも管理する
  • phpenv、phpbrew を利用する

XAMPP、MAMP等のソフトウェアを通して利用するのは簡単ですが、外部プログラムとコマンドラインを通して連携したい際に、パスが通っていないため思わぬトラブルになる可能性があります。

また、設定ファイルが分かりにくい場所にあって、直接編集しにくい、PHP・MySQL単体でのバージョンの切り替えがしにくいという問題もあります。一方、OSデフォルトのPHPはバージョンが切り替えにくいという問題があります。

phpenvはプロジェクトごとにPHPのバージョンが切り替えられてすばらしいですが、フォークがいろいろあるのが気になって使えていません。
なので、Homebrewを使った設定方法について説明してみようと思います。

Homebrewの設定

Homebrew とは Linux での apt や yum の Mac 版です。これだけで記事が書けそうな気もしますが、今回はインストール方法の説明にとどめます。

ということで、Homebrewをインストールしていきます。といっても、リンク先にある通り次のコマンドを実行するだけです。簡単ですね。

[bash]
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
[/bash]

こういうスクリプトをダウンロードしてそのまま実行させる形式のコマンドは攻撃の起点になりやすいので、気になる方はリンク先からコピペするようにしてください。

Homebrew経由でインストールしたコマンド類は /usr/local/bin の下に置かれるので、ここにパスを通します。

[bash]
echo ‘export PATH=/usr/local/bin:$PATH’ >> "$HOME/.$(basename $SHELL)rc"
source "$HOME/.$(basename SHELL)rc"
[/bash]

which brew でbrewコマンドが見つかればインストール成功です。念を入れたい方は brew doctor でディレクトリのパーミッションの問題などを診断してくれます。

Homebrewのデフォルトの状態ではPHPがインストールできません。次のようにすればインストールできるようになります。

[bash]
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/hoembrew-php
[/bash]

ここまでやれば、あとはバージョンに応じて brew install php54brew install php55brew install php56 などでインストールできます。コマンドたった7行でPHPがインストールできました!

最後にApacheの設定ファイルを編集して、今インストールしたPHPを使うことを教えてあげる必要があります。
インストール成功時に出てくるメッセージに従って、 httpd.conf に

[bash]
LoadModule php5_module /usr/local/opt/php5x/libexec/apache2/libphp5.so
[/bash]

を追加またはコメントインします。このメッセージは brew info php5x でいつでも確認できます。xはインストールしたバージョンで置き換えてください。デフォルトでインストールされているapacheの設定ファイルの場所は、/etc/apache2/httpd.conf です。

MySQLのインストールも、MySQL 5.6なら brew install mysql 、 MySQL 5.5 なら brew install mysql55 と瞬殺です。phpMyAdmin だって設定ファイルを編集する必要はありますが brew install phpmyadmin だけでインストール完了です。

バーチャルホストの設定

これで、ドキュメントルートにPHPファイルをおけば、http://localhost/ファイル名 とブラウザからアクセスして閲覧できるようになりました。

でも、このままだと並行プロジェクトの login.php などのよくあるファイル名がかぶって大変だったりします。

http://localhost/project-A/login.php と http://localhost/project-B/login.php と分けると、本番環境と違ってきたりして面倒です。また、ドキュメントルートではなく、ホームディレクトリに近いところで作業したかったりもします。そこで、バーチャルホストを利用します。

そうすると、http://project-A.local/login.php や http://project-B.local/login.php 等のURLでアクセスできるようになります。

バーチャルホストを設定するためには、project-A.local などのサーバ名が自分のマシンであることを設定するための /etc/hosts ファイル、 サーバ名(プロジェクト)とディレクトリ(作業場所)を対応づけるための Apache設定ファイル両方の編集が必要です。面倒なので、コマンド作ってみました。

[bash]
#!/bin/sh

vhost_file=’/private/etc/apache2/extra/httpd-vhosts.conf’
hosts_file=’/etc/hosts’

host=$1
doc_root=$2

function usage() {
echo "$(basename $0) host doc_root"
exit 1;
}

if [ $# -ne 2 ]; then
usage
fi

httpd_version=`httpd -v | head -n 1 | sed -e "s/^.*Apache\/\(2\.[24]\).*$/\1/"`
case $httpd_version in
"2.2")
grant="AllowOverride All
Order allow,deny
Allow from all"
;;
"2.4")
grant="Require all granted"
;;
esac

echo "127.0.0.1 ${host}" >> ${hosts_file}
cat <<CONF >> ${vhost_file}
<VirtualHost *:80>
DocumentRoot "${doc_root}"
ServerName ${host}
<Directory "${doc_root}">
${grant}
</Directory>
</VirtualHost>
CONF

if apachectl -t; then
apachectl graceful
else
echo "Error in httpd-vhost.conf"
exit 1
fi
[/bash]

これを好きな名前で保存(ここではaddvhostとします)して、 chmod u+x addvhost で実行権限を付け、

[bash]
sudo /path/to/addvhost <使いたいサーバ名> <作業場所>
[/bash]

と実行すればバーチャルホストの設定が完了します。大事なファイルを触っているので処理内容を理解して利用してほしいですが、地味に役立ってます。
使う前に、httpd.conf から extra/httpd-vhosts.conf を読み込むようにしてください。

PHP 5.4からはWebサーバが組み込まれています。
作業場所で php -S localhost:8080 として放置すれば、http://localhost:8080/login.php がいつでも作業中のプロジェクトになっているので、このような面倒から解放されます。

全体のまとめ

今回はApacheについてはOS付属のものをそのまま使いましたが、同じような感じで

[bash]
brew tap homebrew/apache
brew intall httpd22 # or brew install httpd24
[/bash]

のようにしてインストールできます。

バージョンの切り替えが容易・いまどのバージョンを使っているのか把握しやすいということを考えると今回紹介した方法やphpenvを用いた方法が良さそうです。

それではまた。エンジニアのきんでした。