あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

Mac OSX + PHP5.5 + postgreSQL9.4 + (Apache2.4) の環境設定

環境設定なんて嫌いだ!! あずきです。

Windows版でもはまりました、このネタw
PHP5.5 と cakePHP2.5.8 と postgreSQL9.4 と Windows8.1 - 相性わるい? - あずきみるくのあずきはニガテ - for Engineer

今度は家のMacでも使えるようにしたいんだけど。。。
やっぱりはまったので備忘録。

どうやら、Macに初めからインストールされているPHPには、postgreSQLに対応する拡張モジュールは入ってないんだそうな。そうな。
だから入れ直さないといけないんだって。
・・・そんなだったら初めから入れてくれなくてもいい。。。orz


<環境>
Mac OS 10.10 Yosemite
PHP 5.5.14 → 5.5.22
postgreSQL 9.4
Apache 2.4.9


早速ですが、手順は以下のとおり。
postgreSQL本体は以下よりすでにインストール済みです。
Download PostgreSQL | EnterpriseDB

1)Homebrewのインストール

このツールはいろいろ落としてきてくれるツールです。
PHPをいい感じでインストールし直す為に、まずは必要な武器を調達します。

Mac向けのインストールツールは他にも何個かあるようですが、HomebrewはMacがすでに持っている環境を把握した上で依存関係を構築してくれるらしく、もとから入っているものは取ってこない、という賢い子のようです。
そのため、軽量で、無駄なものをインストールしないため、PCにも優しいそうです。


Homebrew — OS X用パッケージマネージャー
ここにとんで、書いてあるコマンドをターミナルに貼り付けて起動させます。

ちなみに、「root」でやるとなんかこんな感じで怒られました。

sh-3.2# ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Don't run this as root!

ので、通常のユーザにて実行します。

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
(中略)
Press RETURN to continue or any other key to abort
(ここでreturnキー押下)
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/. /usr/local/bin /usr/local/etc /usr/local/share /usr/local/share/man /usr/local/share/man/man1 /usr/local/share/info
Password: (パスワード入力)

==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/. /usr/local/bin /usr/local/etc /usr/local/share /usr/local/share/man /usr/local/share/man/man1 /usr/local/share/info
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 234921, done.
remote: Compressing objects: 100% (112/112), done.
remote: Total 234921 (delta 70), reused 0 (delta 0), pack-reused 234809
Receiving objects: 100% (234921/234921), 30.40 MiB | 3.58 MiB/s, done.
Resolving deltas: 100% (176159/176159), done.
From https://github.com/Homebrew/homebrew
 * [new branch]      master     -> origin/master
HEAD is now at c1ae255 test-bot pathname: use Utils.popen_read instead of backticks
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started

こんな感じで、落としているようです。

2)PHPを再インストール

で、準備ができたら、Homebrewを使って、新しいPHPをインストールします。

2.1 PHPを扱うFomulaを追加する

Fomulaっていうのは、リポジトリのことらしい。
GitHubみたいな正規のリポジトリじゃなくて、野良リポジトリも使えるように設定するようだ。
(大丈夫かな。。。?)
mavenとかでいうリポジトリの野良版みたいな存在かしらね?
とりあえず、以下を叩いて、設定します。

$ brew tap homebrew/dupes
$ brew tap josegonzalez/homebrew-php

2.2 PHP5.5のインストール

2.2.1 オプションの確認

インストールを実行する前に、必要なオプションを確かめましょう。

$brew info php55

このコマンドで調べられます。
今回、postgreSQLを使いたい!という目的が明確になっているので、
迷わず「--with-postgresql 」オプションは使います。

2.2.2 インストールの実行

ここでようやくインストールが始まります。
今までのは準備体操。

先に言っておきますが、めっちゃ時間かかります。
あずきは20分かかってました。。。

では、コマンド。
ポイントは先にも述べたとおり、「--with-postgresql 」オプションをつけることでしょうか。

$brew install php55 --with-postgresql --without-pear

コマンドを実行した際、何か警告的なものが出ます。
これが出た場合は中身をよく読んで、ちゃんと修正することをお勧めします。

もしオプションの綴りとか何か間違えちゃって、あいたー!な感じになっている人がいたら、、、仲間ですw
おとなしく、以下のコマンドを叩き、今までの20分をなかったことにして、出直しましょう。

$brew uninstall php55

以下は実行時の出力。
(2回目なので少なめw)
なんか、大事なことが書いてありそうなので、撮っておきました。。。

$brew install php55 --with-postgresql --without-pear


==> Installing php55 from josegonzalez/homebrew-php
==> Downloading https://www.php.net/get/php-5.5.22.tar.bz2/from/this/mirror
Already downloaded: /Library/Caches/Homebrew/php55-5.5.22
==> ./configure --prefix=/usr/local/Cellar/php55/5.5.22 --localstatedir=/usr/local/var --s
==> make
==> make install
==> Caveats
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

✩✩✩✩ 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"

✩✩✩✩ FPM ✩✩✩✩

To launch php-fpm on startup:
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php55/homebrew.mxcl.php55.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php55.plist

The control script is located at /usr/local/opt/php55/sbin/php55-fpm

OS X 10.8 and newer come with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:

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

You may also need to edit the plist to use the correct "UserName".

Please note that the plist was called 'homebrew-php.josegonzalez.php55.plist' in old versions
of this formula.

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
==> Summary
🍺  /usr/local/Cellar/php55/5.5.22: 326 files,  48M, built in 20.0 minutes

3)httpd.confの修正

新しいPHPのモジュールをとってきたので、Apacheに教えてあげる必要があるようです。
で、httpd.confを編集します。
ApacheMacに初めからインストールされているものを使用します。

もともと、「LoadModule php5_module」の設定はしてあったので、かち合わないように、以前のものはコメントアウトして新しく追加してみました。

$ sudo vi /etc/apache2/httpd.conf
...
# 以下、もとからあったものをコメントアウト
#LoadModule php5_module libexec/apache2/libphp5.so
# 以下、新しく追加
LoadModule php5_module /usr/local/opt/php55/libexec/apache2/libphp5.so

これ、終わったらApache再起動です。

$ sudo apachectl restart

で、試しにphpinfo()を出してみる。
f:id:azuki-milk-lush:20150307174455p:plain

ふむ。もともと「5.5.14」だったバージョンですが、「5.5.22」に変更された。
ちゃんと見に行っているようです。
成功!

※ちなみに、phpinfo() の出し方は

<?php
phpinfo()

だけ書いたphpファイルを「index.php」とかいう名前にして、ApacheのDocumentRootの直下にでも置いておけば「http://localhost」で見れます。

下もちらちらっと見に行くと・・・
f:id:azuki-milk-lush:20150307175051p:plain

ん?「pgsql」も、「pdo-pgsql」もいけてるんでない?

4)php.iniの修正

が、まだまだいけません。。。
このまま実行すると、エラーのオンパレードです。

PHPが新しくなった、ということはphp.iniも修正しなければならんのです。。。

$ vi /usr/local/etc/php/5.5/php.ini 

...
default_charset = "UTF-8"   # コメントを外す
...
# 以下、追記
extension=pgsql.so
extension=pdo_pgsql.so

...
[Date]
...
date.timezone = Asia/Tokyo  # 追記
...
[mbstring]
...
mbstring.language = Japanese          # コメントアウトを外す
mbstring.internal_encoding = UTF-8  # コメントアウトを外す
mbstring.http_input = UTF-8              # コメントアウトを外す
mbstring.http_output = pass              # コメントアウトを外す
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII    # 追記

注意しないといけないのが、もともとコメントアウトで記載されている

;extension=php_pgsql.dll
;extension=php_pdo_pgsql.dll

は、Windows用のものです。コメントアウトしたままにしておいてください。



以上で使えるようになるはずです!!きっと・・・

おまけ

もし、まだこんなえらーがでたら。。。
f:id:azuki-milk-lush:20150307230509p:plain

「 SQLSTATE[08006] [7] timeout expired」っていうのは、接続情報がおかしくてtimeoutになっている可能性が高いようです。

お手持ちのDB接続情報をすみから隅までチェックしてみてください。



今回、いろいろやってみましたが、実は。。。謎が残っています。

  • Homebrewで落としてきたPHPのファイルはどこにあるのか
  • phpInfoで設定されている「extension_dir」は存在しないのに(デフォルトのままで実際はない)、どこに拡張ファイル(pgsql.soとか)が置かれているのか

この謎は解けていません。。。
誰かご存知だったら教えてくださいorz

<参考にさせていただきました>

MacにPHP5.5をインストール。OPcacheとAPCuも設定 | karakaram-blog

postgresql+phpの環境構築 (Mac OSX, Marvericks) - Qiita

戯言と技術: mac mavericksでpostgresをPHP PDO経由で使う方法

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

PHPをコンパイルした環境に、後からpgsql.soなどのモジュールを追加する方法 - Web系エンジニアbcoのメモ帳