主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

Mac に php をインストールするには

最終更新日 2011-03-21 03:29:08 (1年以上前の記事です)

Mac に LAMP もとい MAMP 環境を構築したときのメモ。いろいろと癖もあったりはまったところもあったけど、とにかくできました。

構築する上でのポリシーとしては、

  • ライブラリ関連はできるだけ DarwinPorts でインストールしたものにリンクさせる。
  • MySQL 、 PostgreSQL 、 Apache 、 php は /usr/local にインストール。
  • Apache と php はなるべく Shared module 化するようにする。

Mac にインストールされているライブラリと DarwinPorts で入れたものを混合するとコンパイルでエラーを起こすことが多いっぽい。

環境は以下の通り。
Mac OS X 10.5.6
mysql-5.1.33
postgresql-8.3.7
apache-2.2.11
php-5.2.9

DarwinPorts のインストール

DarwinPorts は多分 FreeBSD 系のパッケージ管理ツールを移植したやつだと思う。
Redhat 系でいう yum 、debian 系でいう apt かな。

以下からインストーラを取得してインストールする。
http://darwinports.com/

そしたらパスをセットして、 port 自体のアップデートをしておく。

$ vi ~/.bash_profile
export PATH=$PATH:/opt/local/bin
export MANPATH=$MANPATH:/opt/local/share/man
export INFOPATH=$INFOPATH:/opt/local/share/info
$ sudo port -d selfupdate

必要なライブラリのインストール

以下のように port でインストールする。

$ sudo port install gd2
$ sudo port install jpeg
$ sudo port install libpng
$ sudo port install freetype
$ sudo port install cclient
$ sudo port install libmcrypt
$ sudo port install unixodbc

MySQL のインストール

MySQL はパッケージで配布されてるので以下からダウンロードしてインストールする。
http://dev.mysql.com/downloads/

そしたら適当にリンクを作ってパスを通す。

$ sudo ln -s /usr/local/mysql-5.1.33-osx10.5-x86 /usr/local/mysql
$ vi ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin

PostgreSQL のインストール

PostgreSQL もパッケージで配布されてるので以下からダウンロードしてインストールする。
別にいらないならインストールしなくてもいい。
http://www.postgresql.org/download/

そしたら適当にリンクを作ってパスを通す。

$ sudo ln -s /usr/local/postgresql-8.3 /usr/local/postgresql
$ vi ~/.bash_profile
export PATH=$PATH:/usr/local/postgresql/bin

Apache のインストール

Apache はソースからコンパイルしてインストール。
とりあえずほとんどのモジュールを共有ライブラリとしてコンパイルする。

$ ./configure \
--prefix=/usr/local \
--enable-so \
--enable-mods-shared=most \
--enable-ssl \
--with-ssl=/opt/local
$ make
$ sudo make install

php のインストール

そして最後に php のインストールを行う。
何度もコンパイルが通らずに困ったけど、いくつかソースコードの修正と Makefile の調整で通る。
とりあえずは configure する。こちらもほぼ全ての Extension を共有ライブラリとしてコンパイル。
必要なライブラリは DarwinPorts のものを参照するようにする。

$ ./configure \
--prefix=/usr/local \
--with-gnu-ld \
--with-apxs2=/usr/local/bin/apxs \
--with-config-file-path=/usr/local/etc \
--with-config-file-scan-dir=/usr/local/etc/php.d \
--enable-embed=shared \
--with-ldap=shared,/usr \
--with-xmlrpc=shared \
--with-xsl=shared,/usr \
--with-bz2=shared \
--with-sqlite=shared \
--enable-sqlite-utf8 \
--with-mysql=shared,/usr/local/mysql \
--with-curl=shared \
--enable-mbstring=shared \
--enable-mbregex \
--enable-sockets \
--enable-exif \
--enable-ftp \
--with-imap=shared,/opt/local \
--with-imap-ssl=/opt/local \
--with-zlib=/opt/local \
--with-gd=/opt/local \
--with-jpeg-dir=/opt/local \
--with-png-dir=/opt/local \
--with-ttf=shared,/opt/local \
--enable-gd-native-ttf \
--with-freetype-dir=/opt/local \
--with-pdo-mysql=shared,/usr/local/mysql \
--with-pdo-sqlite=shared,/opt/local \
--with-pdo-odbc=shared,unixODBC,/opt/local \
--with-pdo-pgsql=shared,/usr/local/postgresql \
--with-pear \
--with-kerberos \
--enable-soap \
--with-openssl \
--with-openssl-dir=/opt/local \
--with-mcrypt=shared,/opt/local \
--with-mhash=shared,/opt/local \
--with-libxml-dir=/opt/local \
--with-iconv=/opt/local

次に make だけど、いくつかコードを編集しないとだめらしい。
まず以下のコンパイルエラーを得る。

ld: warning, duplicate dylib /usr/lib/libm.dylib
ld: duplicate symbol _yytext in Zend/.libs/zend_ini_scanner.o and
Zend/.libs/zend_language_scanner.o

ここの情報によるとコードを修正しないといけないらしい。

$ vi Zend/zend_ini_scanner.c
char *yytext;

のラインをコメントアウトする。
同様に

$ vi Zend/zend_language_scanner.c

も行う。

さらに Makefile も修正し、 .lo ライブラリをきちんと取り扱えるようにする。

$ vi Makefile
BUILD_CLI = $(CC) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(NATIVE_RPATHS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_CLI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CLI_PATH)

BUILD_CLI = $(LIBTOOL) --mode=link $(CC) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(NATIVE_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_CLI_OBJS) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CLI_PATH)

とする。そしてコンパイル。

$ make
$ make test
$ sudo make install
$ sudo cp php.ini-recommended /usr/local/etc/php.ini

初期設定

後は簡単な初期設定を行って httpd が起動して php も動くことを確認すれば終了。

$ sudo vi /usr/local/conf/httpd.conf
LoadModule php5_module modules/libphp5.so

<IfModule php5_module>
    AddHandler  php5-script php
</IfModule>
$ sudo /usr/local/bin/apachectl start

追記

20/03/2011

Snow Leopard にインストールする際は、EXTRA_CFLAGS="-lresolv" を make 時に渡してやらないと以下のエラーが発生してコンパイルできなかった。

Undefined symbols:
  "_res_9_dn_expand", referenced from:
      _zif_dns_get_mx in dns.o
  "_res_9_search", referenced from:
      _zif_dns_check_record in dns.o
      _zif_dns_get_mx in dns.o
  "_res_9_dn_skipname", referenced from:
      _zif_dns_get_mx in dns.o
      _zif_dns_get_mx in dns.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1

これは Snow Leopard から bind9 が Mac の開発ライブラリに追加されたためらしい。追加したらコンパイルできたから確認してない。

また、同様に Snow Leopard にアップグレードした後に、 libmysqlclient ライブラリのエラーが消えなくて困った。 make test 実施時に

PHP Warning:  PHP Startup: Unable to load dynamic library '/Users/ma/Documents/Build/tar/php-5.3.6-x86_64/modules/pdo_mysql.so' - dlopen(/Users/ma/Documents/Build/tar/php-5.3.6-x86_64/modules/pdo_mysql.so, 9): Library not loaded: libmysqlclient.18.dylib
  Referenced from: /Users/ma/Documents/Build/tar/php-5.3.6-x86_64/modules/pdo_mysql.so
  Reason: image not found in Unknown on line 0

と複数出る。で otool で確認してみると、

$ otool -L modules/mysql.so
modules/mysql.so:
	libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
	/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0)
	/usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

と確かに、ダイナミックライブラリへのパスが通ってない。根本的な原因が分からなかったが、とりあえず install_name_tool を使って解決する。

$ /usr/bin/install_name_tool -change "libmysqlclient.18.dylib" "/usr/local/mysql/lib/libmysqlclient.18.dylib" modules/pdo_mysql.so
最終更新日 2011-03-21 03:29:08

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

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank1, rank2, rank3, rank7, rank9, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google