PHP 7.4.1に移行してみた
今のところ問題ない様子
このWebサーバは、昨年1月に大苦労してPHP 5.6からPHP 7系へ移行したのだけど、その時からPHP 7.3.xxを使ってきた。その間に PHP開発のメインストリームは7.4に移り昨年末に 7.4.0がリリースとなったのだけど、実はウチのMac Mini G4(Mac OS X 10.4.11 Tiger)でビルドすると途中でコケるのだった。mmap()が Illegal argumentを起こしていたので、原因を調べるのも面倒だし、このままPHP 7.3系を使い続けりゃいいかぁとも思ったのだけど、年末年始休みの時間ができた時にチャレンジしたところ何とか突破できたので、その備忘録。
1. 事前準備
今までPHPにバンドルされていたが、PHP 7.4からはバンドルされなくなったとかで、以下のものを事前にインストールしておく必要があった。
- Oniguruma
マルチバイト文字を正規表現で扱うためのライブラリ。現時点での最新版は Ver.6.9.4
- libiodbc
ODBC互換データベースに対する API。データベースの種類を意識することなく、共通APIでアクセスできるようにするものらしい(良くわかってない^^;)。現時点での最新版は Ver.3.5.13 のようなのだけど、ダウンロードできたのは Ver.3.5.12 だった。
1.1 Oniguruma Ver.6.9.4のインストール
ダウンロードした onig-6.9.4.tar.gz を解凍して普通にビルドするだけ。
$ tar xzf onig-6.9.4.tar.gz
$ cd onig-6.9.4
$ ./configure CFLAGS="-O2"
$ make
$ make check
$ sudo make install
|
1.2 libiodbc Ver.3.52.12のインストール
こちらもダウンロードした libiodbc-3.52.12.tar.gz を解凍して普通にビルドするだけ。
$ tar xzf libiodbc-3.52.12.tar.gz
$ cd libiodbc-3.52.12
$ ./configure CFLAGS="-O2"
$ make
$ make check
$ sudo make install
|
2. PHP 7.4.1のインストール
2.1 ソースプログラム修正
ウチの MacOS X で mmap()が Illegal argument になる問題を修正する。修正するのは "Zend/zend_alloc.c"の1つだけ。修正個所は、114行めからの以下の部分。
#ifndef __APPLE__
# define ZEND_MM_FD -1
#else
/* Mac allows to track anonymous page via vmmap per TAG id.
* user land applications are allowed to take from 240 to 255.
*/
# define ZEND_MM_FD (250<<24)
#endif
|
↓
//#ifndef __APPLE__
# define ZEND_MM_FD -1
//#else
/* Mac allows to track anonymous page via vmmap per TAG id.
* user land applications are allowed to take from 240 to 255.
*/
//# define ZEND_MM_FD (250<<24)
//#endif
|
ZEND_MM_FDは mmap()の第5引数のファイルディスクリプタに指定されている。ファイルディスクリプタが -1 の場合はメモリ空間にファイルをマッピングするのではなく、単にメモリ領域を獲得することになるはずなのだが、最近の macOSでは何やら特別なメモリページを獲得するようにしているっぽい。ウチのような古い Mac OS X の場合は -1 にすれば良いはず。
2.2 ビルドスクリプト
指定するオプションが多く今後何度も使うことになるので、ビルドスクリプト"build.sh"を作成しておく。ビルドスクリプトは以下。
#!/bin/bash -x
export MACOSX_DEPLOYMENT_TARGET=10.4
export GCC="/usr/local"
export SSL="/usr/local/libressl"
export PATH="${GCC}/bin:/usr/local/bin:/usr/bin:${PATH}"
export DYLD_LIBRARY_PATH="${SSL}/lib:${GCC}/lib:${DYLD_LIBRARY_PATH}"
export PKG_CONFIG_PATH="${SSL}/lib/pkgconfig:${PKG_CONFIG_PATH}"
export OPTFLAGS="-O2"
export CFLAGS="${OPTFLAGS} -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}"
export PREFIX="/usr/local/php7"
./configure \
--prefix=${PREFIX} \
--with-apxs2="/usr/local/apache2/bin/apxs" \
--with-config-file-scan-dir="${PREFIX}/php.d" \
--with-iconv-dir="/usr/local" \
--with-openssl=${SSL} \
--with-openssl-dir=${SSL} \
--with-zlib=/usr \
--with-zlib-dir=/usr \
--enable-gd \
--with-external-gd \
--with-bz2="/usr/local" \
--with-xmlrpc \
--enable-exif \
--enable-soap \
--enable-ftp \
--enable-sockets \
--enable-mbstring \
--enable-calendar \
--enable-bcmath \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-curl="/usr/local" \
--with-zip \
--with-mysql-sock=/tmp/mysql.sock \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-kerberos=/usr \
--with-imap-ssl=/usr \
--without-iodbc \
--with-gettext=shared,/usr/local \
CC="${GCC}/bin/gcc" \
CXX="${GCC}/bin/g++" \
CPP="${GCC}/bin/cpp" \
CPPFLAGS="-I${SSL}/include -I/usr/local/include -I/usr/include" \
CFLAGS="${CFLAGS}" \
CXXFLAGS="${CFLAGS}" \
LDFLAGS="-L${SSL}/lib -L${GCC}/lib -L/usr/local/lib -L/usr/lib"
make
make test >check.log
|
注)「¥」は実際には半角の「\」(バックスラッシュ)
2.3 ビルドしてインストール
$ bzcat php-7.4.1.tar.bz2 | tar xf -
$ cd php-7.4.1
$ vi build.sh # 上のスクリプトを作成
$ chmod +x build.sh
$ ./build.sh
$ sudo make install
|
ビルドにはかなり時間がかかるし、make testも最後まで実行できず途中でメモリ不足でコケる。コケたときのメッセージを見る限り4GB以上のメモリを採ろうとして失敗しているようなので、32bit OSでは失敗して当たり前。まぁ、使う機能が動きゃ良いんで、全テストがパスしなくても気にしないっと。
インストールしたらApacheを再起動して完了。
|