OS X YosemiteにHomebrew + DropboxでPHP環境構築　〜Apache, PHP, MySQL, ComposerをインストールしてFuelPHPの設定まで

Mac OS Yosemiteきれいですね。

私はPHPの環境構築をHomebrewとDropboxで行っているのですが、YosemiteになってXcodeやコマンドラインツールまわりが更新されて少々ハマったのでメモしました。

各項目、必要に応じて公式ドキュメントなども見てみてください。

# OS X Yosemiteのインストール
AppStoreのアップデートから更新してください。

# Xcodeのインストール
OS X Yosemiteでは各種コンパイルにXcodeが必要と要求してくるので、Yosemiteのインストール時にXcodeのインストールまで進まなかった場合は、下記コマンドでXcodeをインストールしてください。

```bash
$ xcode-select --install
```

または[Xcodeのアプリ](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)から、Command Line Toolsをインストールしてください。ダウンロードにはApple IDが必要です。

Xcode本体を含め、5GBほどあるので結構時間がかかります。

最新版であれば、下記コマンドでXcode Command Line Toolsのパスを確認できます。

```bash
$ xcode-select -p
/Library/Developer/CommandLineTools
```

# Homebrew

## Homebrewのインストールと設定
```bash
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

参考 : [Homebrew](http://brew.sh/index_ja.html)

Xcodeのコマンドラインツールについてのメッセージが出なかった場合は、念のため下記コマンドを実行します。

```bash
$ xcode-select --install
```

また、途中でJavaのインストールが求められるかもしれません。
指示があればそれに従い、それがなければ下記リンクよりApple公式のMacOS向けのJavaをインストールできます。
http://support.apple.com/kb/DL1572

ついでにGitはHomebrewでインストールして最新のものになるようにしておきます。

```bash
$ brew install git
```

Homebrewのインストールが完了したら、下記を.bashrcなどに追記します。

```bash:~/.bashrc（または~/.bash_profile）
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH
```

最後に`brew doctor`でHomebrewの環境をチェックします。

```bash
$ brew doctor
```

## Homebrewの使用例
時間が経つとformulaが更新されて今までと同じ名前でインストールできないことがよくあります。
なので必ず`brew search`コマンドでそのformulaが存在するかを毎回確認することをおすすめします。

```bash
# Apache2.2系をインストールしたい（そんなもんねぇよと怒られる）
$ brew install httpd22
Error: No available formula for httpd22

# formulaを探す（名前が変わっていた）
$ brew search httpd
darkhttpd      libmicrohttpd  lighttpd	     mighttpd2
homebrew/apache/httpd22	      homebrew/apache/httpd24	    homebrew/head-only/httpdiff

# formulaをインストールする（無事、インストール完了）
$ brew tap homebrew/apache
$ brew install httpd22

# 定期的に更新しましょう
$ brew update
$ brew upgrade

# 定期的にお医者さんにかかりましょう
$ brew doctor
```


# MySQLのインストールと設定

```bash
# インストール
$ brew install mysql

# MySQLの起動
$ mysql.server start

# MySQLの停止
$ mysql.server stop

# MySQLの再起動
$ mysql.server restart

# パスワードの変更
# rootユーザのパスワードを変更するには下記コマンドを実行し、新しいパスワードを入力します。
$ mysqladmin -u root password

# rootユーザでログイン
# パスワード入力を求められるので入力して
$ mysql -u root -p
```

※注意
Homebrewでインストールしたmysqlは、初期設定でKeepAliveがONになっています。そのため、`mysql.server stop`コマンドが正しく実行できても、すぐに再起動されるため実際には停止できません。どうしてもmysqlを停止させたくなったときは、KeepAliveをfalseに設定しましょう。

# Apacheのインストールと設定
今回はApache2.2系をインストールします。
Apache2.4系はhttpd.confやhttpd-vhost.confなどの設定方法が若干違うので、2.4系が良い方は適宜調べて修正してください。

```bash
$ brew tap homebrew/dupes
$ brew tap homebrew/apache
$ brew install httpd22
```

下記コマンドでApacheのパスを確認します。

```bash
$ which apachectl
/usr/local/bin/apachectl
```

また、Apacheのバージョンも確認します。

```bash
$ apachectl -v
Server version: Apache/2.2.31 (Unix)
Server built:   Aug 14 2015 08:55:34
```

## httpd.confの修正
Apacheの設定ファイルであるhttpd.confを編集します。
今回は、Dropboxにhtdocsフォルダを作成し、そこをPHPの実行環境にする設定にします。

**※php56/php70共通**

```apache:/usr/local/etc/apache2/2.2/httpd.conf
# 使用するポート番号の設定
# デフォルトで8080かもしれないが、今回は80にする
Listen 80

# php5のモジュールの追加
# ここは後述の方法でHomebrewでPHPをインストールする場合は不要なので注意
LoadModule php5_module /usr/local/opt/php56/libexec/apache2/libphp5.so

# ServerNameの設定
# 上でポート番号を80にしたので、ここも80にする
ServerName localhost:80

# DocumentRootの変更
DocumentRoot "/Users/ユーザ名/Dropbox/htdocs"

# .htaccessでURLのoverwriteを許可 ( Directory "/Users/ユーザ名/Dropbox/htdocs" 内 )
AllowOverride All

# index.phpを使えるように修正 ( IfModule dir_module 内 )
DirectoryIndex index.php index.html

# .phpを実行できるようにMIMEタイプを追加 ( IfModule mime_module内 )
AddType application/x-httpd-php .php

# バーチャルホストを利用できるようにコメントアウトを解除
Include /usr/local/etc/apache2/2.2/extra/httpd-vhosts.conf
```

**※php70の場合**

```apache:/usr/local/etc/apache2/2.2/httpd.conf
LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so

# 以下も追記する必要あり
<FilesMatch .php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```


## httpd-vhosts.confの修正
例えば`http://sample.local`というバーチャルホストでドキュメントルートを~/Dropbox/htdocsにしたい場合、下記のようにバーチャルホストを追加してダミーホストをコメントアウトします。

```apache:/usr/local/etc/apache2/2.2/extra/httpd-vhosts.conf
#
# Virtual Hosts
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName sample.local
    DocumentRoot /Users/ユーザ名/Dropbox/htdocs
    DirectoryIndex index.php index.html

    # フレームワークなどの必要性に応じて下記を設定
    <Directory "/Users/ユーザ名/Dropbox/htdocs">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

#
# 基本的な設定はhttpd.confにしているので、実際には下記の4行だけでも素のPHPは動きます。
#
<VirtualHost *:80>
    ServerName sample.local
    DocumentRoot /Users/ユーザ名/Dropbox/htdocs
</VirtualHost>

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
#<VirtualHost *:8080>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot "/usr/local/opt/httpd22/docs/dummy-host.example.com"
#    ServerName dummy-host.example.com
#    ServerAlias www.dummy-host.example.com
#    ErrorLog "/usr/local/var/log/apache2/dummy-host.example.com-error_log"
#    CustomLog "/usr/local/var/log/apache2/dummy-host.example.com-access_log" common
#</VirtualHost>

#<VirtualHost *:8080>
#    ServerAdmin webmaster@dummy-host2.example.com
#    DocumentRoot "/usr/local/opt/httpd22/docs/dummy-host2.example.com"
#    ServerName dummy-host2.example.com
#    ErrorLog "/usr/local/var/log/apache2/dummy-host2.example.com-error_log"
#    CustomLog "/usr/local/var/log/apache2/dummy-host2.example.com-access_log" common
#</VirtualHost>
```

## hostsファイルの修正

上記までの設定以外に、バーチャルホストの名前解決をhostsファイルに記述してあげる必要があるので、`http://sample.local`をというバーチャルホストで/Dropbox/htdocsを参照したい場合、下記のようにします。

```:/private/etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
#
# バーチャルホストの個人設定
127.0.0.1 sample.local
```

Dropboxなどに設定ファイルを置いている場合は、元々有るhostsファイルを削除してシンボリックリンクを貼ることで対応できます。

```bash:/private/etc
$ cd /private/etc
$ sudo rm -f hosts
$ sudo ln -s ~/Dropbox/パス/hosts
```

## Apacheの起動、停止
下記コマンドでApacheの起動や停止を行います。
まだPHPをインストールしていないので、次の手順であるPHPのインストールが完了したら下記コマンドでApacheが正しく起動できるか確認します。

```bash
# Apacheの起動
$ sudo apachectl start

# Apacheの停止
$ sudo apachectl stop

# Apacheの再起動
$ sudo apachectl restart
```

※Apacheの起動がうまくいかない場合は後述のトラブルシューティングを参照してください。


# PHPのインストールと設定

#### HomebrewでPHPをインストール

```bash
# php56
$ brew tap homebrew/php
$ brew install php56 --homebrew-apxs

# php70
$ brew tap homebrew/php
$ brew install php70 --with-homebrew-apxs
```

上記でエラーが出る場合は、下記もtapしてインストールしてみてください。

```bash
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
```

`--with-homebrew-apxs`を指定すると、Apacheのhttpd.confに下記が自動で追記されるので便利です。
（**注** : `--homebrew-apxs`は廃止され、代わりに`--with-homebrew-apxs`を利用するように変更されました。）

```apache:/usr/local/etc/apache2/2.2/httpd.conf
# php56
LoadModule php5_module /usr/local/Cellar/php56/5.6.16/libexec/apache2/libphp5.so

# php70
LoadModule php7_module /usr/local/Cellar/php70/7.0.1/libexec/apache2/libphp7.so
```

逆に、すでにhttpd.confでphp5_moduleを読み込んでいる場合は、該当箇所を削除してから`brew install php56 --with-homebrew-apxs`すると、エラーを吐かずにApacheを起動できるようになると思います。
（依存関係を考慮してインストールしてくれるので）

インストールに失敗する方は、最後にあるトラブルシューティングを参考にしてください。
「PHPのインストールの際に、`configure: error: Cannot find libz`というエラーが発生してインストールできない場合の対処法」あたりにひっかかる方が多いかと思います。

インストールが完了したら、`php -v`コマンドでPHPのバージョンを確認します。

```prompt
$ php -v
PHP 7.0.1 (cli) (built: Dec 18 2015 19:20:08) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
```

~~2014/10/21現在でphp55では5.5.18が最新版です。~~
~~2015/07/31現在でphp56では5.6.11が最新版です。~~
2015/12/20現在でphp56では5.6.16、php70では7.0.1が最新版です。

#### パスを通す
もしHomebrewでインストールしたPHPではなくMacに最初から入っているPHPのバージョンが出る場合には、下記のようにパスを通してシェルを再起動します。

```bash:~/.bashrc
# php56
export PATH="$(brew --prefix homebrew/php/php56)/bin:$PATH"

# php70
export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"
```

#### php.iniの設定
また、デフォルトではphp.iniが日本語圏に対応していないので、修正します。

```ini:/usr/local/etc/php/7.0/php.ini
date.timezone = Asia/Tokyo
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
```

`mbstring.detect_order`はデフォルトではautoになっていて良さそうに見えますが、autoだとOSの環境によっては正しくエンコーディングされない可能性が生じるので、設定しておいたほうがいいでしょう。

文字コードの決定順序は、PHPのCurlなどでスクレイピングなどをする際の文字化けにも関連していることがあるので、覚えておいて損はないと思います。

#### その他のモジュール
Xdebugやその他のモジュールが必要な場合は、`brew search`で存在するか確認をしてからインストールします。

```bash
$ brew search php70

# 表示されるリストの中にXdebugがあればインストール
$ brew install php70-xdebug
```


# Composerのインストール

```bash
$ brew install composer
```

インストールが完了したら、`composer -v`を実行して確認します。


# FuelPHPのインストール
FuelPHPは2014年10月時点で最新バージョンである1.7.2からは依存関係がComposerで管理できるようになりました。

```prompt
$ composer create-project fuel/fuel:dev-1.7/master プロジェクト名
```

Composerで管理されるパッケージの一覧は、ダウンロードされたFuelPHPプロジェクト直下のcomposer.jsonに記述してあります。

Composerをアップデートするには、下記コマンドを実行します。

```FuelPHPプロジェクト/
$ php composer.phar self-update
$ php composer.phar update
```

インストールが完了したら、FuelPHPの環境変数を設定しておきましょう。
参考：「[FuelPHPの環境変数の設定まとめ](http://qiita.com/saltyshiomix/items/4dcf99b59dee4e0db93d)」


# おまけ

## トラブルシューティング
### `brew upgrade`の際に、`Error: Formulae found in multiple taps:`と怒られる場合の対処法

```bash
# エラー内容
Error: Formulae found in multiple taps: 
 * homebrew/php/php53
 * josegonzalez/php/php53

# 必要のないベンダーをuntap
$ brew untap josegonzalez/php

# アップグレード
$ brew upgrade
```

### Homebrewを使っていたら`Error: GitHub API rate limit exceeded`と怒られ1時間待たないといけなくなってしまった場合の対処法
`brew search`コマンドを利用していると、1時間に60回までというAPIの制限を超えてしまうときがあります。

```
Error: GitHub API rate limit exceeded for xxx.xxx.xxx.xx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
You may want to create an API token: https://github.com/settings/tokens
and then set HOMEBREW_GITHUB_API_TOKEN.
```

その場合の対処方法は以下のようになります。

- [github.com/setting/tokens](https://github.com/settings/tokens)でAPIトークンを発行
- そのトークンを以下のように`.bashrc`などに追記
- ターミナルを再起動すると1時間に5000回までリクエストを送信できるようになります

```bash:~/.bashrc
export HOMEBREW_GITHUB_API_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```


### Apacheの起動の際に、`Reason: Incompatible library version: libphp5.so requires version 6.0.0 or later, but libaprutil-1.0.dylib provides version 4.0.0`というエラーを吐いてうまくいかない場合の対処法

Apacheの起動や再起動の際に、上記のような`libphp5.so`に関するエラーが表示される場合、下記手順でphp55を再インストールすると解消されることが多いようです。

```bash
$ brew uninstall --force php70
$ brew install php70 --with-homebrew-apxs
```

参考「[Apache not Starting](https://github.com/Homebrew/homebrew-php/issues/763)」

### Apacheの起動の際に、Macにデフォルトで入っているApacheが80ポートを使用していて起動できない場合の対処法

```bash
# MacデフォルトのApacheを停止
$ sudo /usr/sbin/apachectl stop

# MacデフォルトのApacheが自動で再起動しないようにする
$ sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist

# 自分でインストールしたApacheの起動
$ sudo apachectl start
```


### PHPのインストールの際に、`configure: error: Cannot find libz`というエラーが発生してインストールできない場合の対処法
下記のコマンドを実行してください。

```bash
$ sudo xcode-select --install && sudo xcode-select -s /Library/Developer/CommandLineTools
```

### PHPのインストールの際に、`configure: error: Cannot find OpenSSL's <evp.h>`のようなエラーが発生してインストールできない場合の対処法

海外でも話題になっているようです。
Mac OSをYosemiteにした人の間で流行っているんだとかｗ

参考「[Yosemite DP - configure: error: Cannot find OpenSSL's <evp.h>](https://github.com/Homebrew/homebrew-php/issues/1181)」

対処方法をまとめると、

- Mac OS X Yosemite バージョン10.10にする
- Xcode6.1をインストールする
- プロンプトで`xcode-select --install`コマンドを打って必要なツール群をインストールする
- この後`brew update`と`brew upgrade`し、無事`brew install php55`ができるようになる

とのことです。

実際に私もこの問題が起きて、実際にこの方法で対処できました。

## HomebrewでインストールしたPHPについて
HomebrewでインストールしたPHPは、インストール時に表示される説明にその設定方法の大枠が書いてあります。

参考までにここに添付します。

```
To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php5_module    /usr/local/opt/php55/libexec/apache2/libphp5.so

The php.ini file can be found in:
    /usr/local/etc/php/5.5/php.ini


✩✩✩✩ PEAR ✩✩✩✩

If PEAR complains about permissions, 'fix' the default PEAR permissions and config:
    chmod -R ug+w /usr/local/Cellar/php55/5.5.18/lib/php
    pear config-set php_ini /usr/local/etc/php/5.5/php.ini


✩✩✩✩ Extensions ✩✩✩✩

If you are having issues with custom extension compiling, ensure that
you are using the brew version, by placing /usr/local/bin before /usr/sbin in your PATH:

      PATH="/usr/local/bin:$PATH"

PHP55 Extensions will always be compiled against this PHP. Please install them
using --without-homebrew-php to enable compiling against system PHP.


✩✩✩✩ PHP CLI ✩✩✩✩

If you wish to swap the PHP you use on the command line, you should add the following to ~/.bashrc,
~/.zshrc, ~/.profile or your shell's equivalent configuration file:

      export PATH="$(brew --prefix homebrew/php/php55)/bin:$PATH"

To have launchd start php55 at login:
    ln -sfv /usr/local/opt/php55/*.plist ~/Library/LaunchAgents
Then to load php55 now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php55.plist
```

## 各パッケージの削除方法

### MySQL

```prompt
$ brew uninstall mysql
$ rm -rf /usr/local/var/mysql
```

### PHP

```prompt
brew uninstall php55
brew uninstall php55-xdebug
rm -rf /usr/local/etc/php
rm -rf /usr/local/opt/php55
```

### Apache

```prompt
$ brew uninstall httpd22
$ rm -rf /usr/local/etc/apache2/2.2
$ rm -rf /usr/local/var/log/apache2
```