読者です 読者をやめる 読者になる 読者になる

uzullaがブログ

uzullaがブログです。

MavericksでPHP5.3.28をphp-buildする話

php

昨日CROSS2014でしたね、たのしかったですね。

しかし多分次は出禁やで…。

http://instagram.com/p/jQ9jOhTNM4/
危うく参加させられそうだった。

教訓。「マイクは音がならないとつらいし、出演者にもマイクがないとつらい」

気を取り直していこう。

PHP5.3の案件がはいりそうなので、とりあえずphpenv+php-buildでPHP5.3を入れようとしたんですけど、まあMavericksだとビルドでコケます。

libtoolがない

まずはこいつ

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
#define Z_STRVAL(zval)                  (zval).value.str.val
                                        ^
In file included from /var/tmp/php-build/source/5.3.28/Zend/zend_execute.c:1295:
Zend/zend_vm_execute.h:30142:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
4 warnings generated.
ld: library not found for -lltdl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/fpm/php-fpm] Error 1
-----------------------------------------

これはlibtool がはいってないので、Homebrewでbrew install libtoolすればいいだけですね、簡単です。

opensslがダメ

次のやつがちょっと難問

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
      _load_all_certs_from_file in openssl.o
  "_sk_value", referenced from:
      _zif_openssl_x509_parse in openssl.o
      _zif_openssl_csr_new in openssl.o
      _zif_openssl_pkcs7_verify in openssl.o
      _php_openssl_parse_config in openssl.o
      _php_openssl_sockop_set_option in xp_ssl.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/fpm/php-fpm] Error 1
-----------------------------------------

ログとか色々みたら、既存のOpenSSLがうまいこといってないやつだ。
brew install opensslしたわけですよ、でもこれkeg-onlyですからね、デフォルトのやつと置き換わってくれるわけではない。

brew link --force openssl

でforceしろやってのが一般回答っぽいんだけど、あんま好きな解決策ではない。

で、php-buildってのは /var/tmp/php-build/source/5.3.28 とかにソースがおちるので、そこに移動して、config.statusをみると、configureオプションがみれる。たとえばこういうの

./configure --with-config-file-path=/Users/uzulla/.phpenv/versions/5.3.28/etc --with-config-file-scan-dir=/Users/uzulla/.phpenv/versions/5.3.28/etc/conf.d --prefix=/Users/uzulla/.phpenv/versions/5.3.28 --libexecdir=/Users/uzulla/.phpenv/versions/5.3.28/libexec --without-pear --with-gd --enable-sockets --with-jpeg-dir=/usr --enable-exif --enable-zip --with-zlib --with-zlib-dir=/usr --with-kerberos --with-openssl --with-mcrypt=/usr --enable-soap --enable-xmlreader --with-xsl --enable-ftp --enable-cgi --with-curl=/usr --with-tidy --with-xmlrpc --enable-sysvsem --enable-sysvshm --enable-shmop --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pdo-sqlite --enable-pcntl --enable-mbstring --disable-debug --enable-fpm --enable-bcmath --with-libedit --with-png-dir=/usr/X11

こいつをコピーして、brewではいったopensslのディレクトリを/usr/local/Cellar/openssl/から確認して

--with-openssl=/usr/local/Cellar/openssl/1.0.1f

ここんところだけこうかきかえた、configureを実行して、あとはmake; make test; make install;すれば行けます。

とりあえずmake testでOpenssl関連エラーでてないので、だいじょうぶそうです。

あとは/var/tmp/php-build/source/5.3.28/php.ini-developmentをコピーしましょう

cp php.ini-development /Users/uzulla/.phpenv/versions/5.3.28/etc/php.ini

ということでforce linkしないでいいかんじにやる情報でした。

ちなみに

正しい方法で行く人は

~/.phpenv/plugins/php-build/share/php-build/definitions/5.3.28

を編集したり、コピって適当なファイル名にして

configure_option -R "--with-openssl" "/usr/local/Cellar/openssl/1.0.1f "

と良い感じに記述するとよい。