PHP7.4.6をCentOS7にソースインストール

覚書です。
ところどころ省いています。
実践環境で使う場合はご注意ください。

PHP7.4.6をWindows10にインストールはこちら

特徴

  • ソースコードからのインストール
  • 複数バージョンの共存

特定バージョンでの開発や動作確認など開発環境での用途を目的としています。

環境

今回は、CentOS7とCentOS6の2カ所にインストールすることになりました。

CentOS7

実施日2020-5-18
サーバさくらのVPS 2G
OSCentOS 7.7
cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
rpm -qa | grep centos-release
centos-release-7-8.2003.0.el7.centos.x86_64

CentOS6

実施日2020-5-23
サーバさくらのVPS 2G
OSCentOS 6.1
cat /etc/redhat-release
CentOS release 6.10 (Final)
rpm -qa | grep centos-release
centos-release-6-10.el6.centos.12.3.x86_64

事前準備

PHP 7.4.6

/tmp/php-7.4.6.tar.gz

PHPダウンロードページからダウンロードして、/tmp にアップ

MySQL

事前にMySQLクライアントとして使うMySQLをインストールしておきます(インストール手順は別の記事で後日)

MySQLを使わない場合、他のデータベースを使う場合は、以降の configure を調整してください

libxml2

libxml2-2.9.9

PHP7.0.0からは 2.9.0 以上が良さそうです。
PHP Predefined Constants の 「Only available in Libxml」
ここにある定数を使わないなら古いバージョンでも動きます。

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libxml2-2.9.9/lib/pkgconfig"

libzip

PHPをconfigureしていると次のエラーが発生しました。

configure: error: Please reinstall the libzip distribution

PHP7.3 からはlibzip の 0.11 以上が必須になったようです。

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libzip-1.6.1/lib64/pkgconfig"

インストール

設定

DIR_SOURCE=/tmp
PHP_VERSION=7.4.6
MYSQL_VERSION=5.5.27
MYSQL_TITLE=mysqlnd
MYSQL_CLIENT=mysqlnd
MYSQLI_CLIENT=mysqlnd
MYSQLPDO_CLIENT=mysqlnd

※MYSQL_VERSION は、独自にインストールしたMySQLを指定する場合に必要。YUM で入れた MySQL を使う場合は未指定でOK。

事前準備

# /usr/local/src にディレクトリを作る
mkdir /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE

# ↑で作ったディレクトリに移動
cd /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE

# /tmp にアップしておいた tar.gz を移動
cp $DIR_SOURCE/php-$PHP_VERSION.tar.gz /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php-$PHP_VERSION.tar.gz

# 解凍
tar xzf php-$PHP_VERSION.tar.gz

# 解凍先に移動
cd php-$PHP_VERSION

--with-imap を付ける場合

yum install libc-client-devel

--with-mcrypt を付ける場合

yum install libmcrypt-devel

configure

# 定義されているか確認
echo $PKG_CONFIG_PATH

# 加える
# export PKG_CONFIG_PATH=/usr/local/lib/libxml2-2.9.9/lib/pkgconfig
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libxml2-2.9.9/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libzip-1.6.1/lib64/pkgconfig"

./configure \
--prefix=/usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE \
--program-suffix=-$PHP_VERSION-mysqlc-$MYSQL_TITLE \
--with-config-file-path=/usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE \
--with-libdir=lib64 \
--with-pic \
--with-curl \
--with-gettext \
--with-iconv \
--with-layout=GNU \
--with-kerberos \
--with-unixODBC=shared,/usr \
--with-libxml \
--with-zlib \
--with-openssl \
--with-zip \
--without-pear \
--enable-cgi \
--enable-mbstring \
--enable-cli \
--enable-exif \
--enable-ftp \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-shmop \
--enable-calendar \
--enable-opcache \
--enable-intl \
--disable-debug
imap を使うなら
--with-imap=/usr
--with-imap-ssl

mcrypt を使うなら
--with-mcrypt

soap を使うなら
--enable-soap

--with-zip   PHP 7.4.0 以降
--enable-zip PHP 7.4.0 より前

インストール

make
make test
make install

パスを通す

# セット
echo 'PATH=$PATH:'"/usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE"/bin >> /etc/profile.d/php.sh
echo "export PATH" >> /etc/profile.d/php.sh

# 確認
cat /etc/profile.d/php.sh

# 反映
source /etc/profile.d/php.sh

php.iniを設定

# php.ini-development を php.ini としてコピーして配置
cp /usr/local/src/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php-$PHP_VERSION/php.ini-development /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini

# タイムゾーンを Asia/Tokyo に変更
sed -i -e "s/^;date\.timezone =[^A-Za-z]*$/date.timezone =/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^date\.timezone =[^A-Za-z]*$/date.timezone = Asia\/Tokyo/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini

次の3つの .sock は yum でMySQLをインストールした場合の位置
# sed -i -e "s/^mysql\.default_socket =$/mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^mysqli\.default_socket =$/mysqli.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^pdo_mysql\.default_socket=$/pdo_mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini

OPcacheの設定 (公式のデフォルトで設定)
http://php.net/manual/ja/opcache.installation.php
# sed -i -e "s/^;opcache.memory_consumption=/opcache.memory_consumption=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.interned_strings_buffer=/opcache.interned_strings_buffer=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.max_accelerated_files=/opcache.max_accelerated_files=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.revalidate_freq=/opcache.revalidate_freq=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
# sed -i -e "s/^;opcache.enable_cli=/opcache.enable_cli=/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini

vi /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
opcache.fast_shutdown=1
が無いと思うので [curl] の上あたりに追記する
# mysql をソースからインストールしている場合はこちら
sed -i -e "s/^mysql\.default_socket =$/mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^mysqli\.default_socket =$/mysqli.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^pdo_mysql\.default_socket=$/pdo_mysql.default_socket = \/var\/lib\/mysql\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini

確認

# php.iniのタイムゾーン
grep -E 'date.timezone|default_socket' /usr/local/lib/php-7.4.6-mysqlc-mysqlnd/php.ini

# php.ini
vi /usr/local/lib/php-7.4.6-mysqlc-mysqlnd/php.ini

バージョン

php-7.4.6-mysqlc-mysqlnd -v
PHP 7.4.6 (cli) (built: May 18 2020 20:58:01) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

あとがき

mysqlnd について
昔はMySQLクライアントを複数から選択できていたので、「php-バージョン-mysqlc-クライアント」のようにしていたけど、もうmysqlnd一択みたいな感じなので名前に入れなくても良いかなと思います。
詳しくはこのあたり

エラーになるとき

no acceptable C compiler

次のようなエラーメッセージのとき

configure: error: no acceptable C compiler found in $PATH
yum install gcc

Cコンパイラがないのでインストールします。

No package 'krb5-gssapi' found

次のようなエラーメッセージのとき

checking for krb5-gssapi krb5... no
configure: error: Package requirements (krb5-gssapi krb5) were not met:

No package 'krb5-gssapi' found
No package 'krb5' found
yum install krb5-devel krb5-server

krb5がないのでインストールします。

CentOS6の場合、諦めましょう。
https://forum.directadmin.com/threads/php-7-4-installation-error.59617/page-2
こちらで同じ現象が報告されています。
configure から --with-kerberos を外します。

No package 'openssl' found

次のようなエラーメッセージのとき

checking for openssl >= 1.0.1... no
configure: error: Package requirements (openssl >= 1.0.1) were not met:

No package 'openssl' found
yum install openssl-devel

opensslがないのでインストールします。

No package 'sqlite3' found

次のようなエラーメッセージのとき

checking for sqlite3 > 3.7.4... no
configure: error: Package requirements (sqlite3 > 3.7.4) were not met:

No package 'sqlite3' found
yum install sqlite-devel

sqlite3がないのでインストールします。

CentOS6のときは、sqlite3をソースからインストールします。
SQLite3.32.0をCentOS6にソースインストール
その後▼します。

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/sqlite-3.32.0/lib/pkgconfig"

No package 'libcurl' found

次のようなエラーメッセージのとき

checking for libcurl >= 7.15.5... no
configure: error: Package requirements (libcurl >= 7.15.5) were not met:

No package 'libcurl' found
yum install curl-devel

libcurlがないのでインストールします。

No package 'icu-uc' found

次のようなエラーメッセージのとき

checking for icu-uc >= 50.1 icu-io icu-i18n... no
configure: error: Package requirements (icu-uc >= 50.1 icu-io icu-i18n) were not met:

No package 'icu-uc' found
No package 'icu-io' found
No package 'icu-i18n' found
yum install libicu-devel

libicuがないのでインストールします。

CentOS6のときは、yumで入れたバージョンは古いようでダメでした。
必要がなければ、 configure から --enable-intl を外します。
必要な場合は、独自にicuをインストールして、PKG_CONFIG_PATH かな?(未確認)

configure: error: C++ preprocessor "/lib/cpp" fails sanity check

次のようなエラーメッセージのとき

configure: error: in `/usr/local/src/php-7.4.6-mysqlc-mysqlnd/php-7.4.6':
configure: error: C++ preprocessor "/lib/cpp" fails sanity check
See `config.log' for more details
yum install gcc-c++

gccがないのでインストールします。

No package 'oniguruma' found

次のようなエラーメッセージのとき

checking for oniguruma... no
configure: error: Package requirements (oniguruma) were not met:

No package 'oniguruma' found
yum install oniguruma-devel

# oniguruma がないときは remi を入れる
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

onigurumaがないのでインストールします。

CentOS6のときは、onigurumaをソースからインストールします。
oniguruma6.9.5をCentOS6にソースインストール
その後▼します。

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/oniguruma-6.9.5/lib/pkgconfig"

configure: error: ODBC header file

次のようなエラーメッセージのとき

checking for Easysoft ODBC-ODBC Bridge support... no
checking whether to build with unixODBC support... configure: error: ODBC header file '/usr/include/sqlext.h' not found!
yum install unixODBC-devel

unixODBCがないのでインストールします。

configure: WARNING: unrecognized options

次のようなエラーメッセージのとき

Thank you for using PHP.

configure: WARNING: unrecognized options:
  --with-freetype-dir,
  --with-png-dir,
  --with-jpeg-dir,
  --with-libxml-dir,
  --with-gd,
  --with-libzip,
  --enable-zip,
  --enable-wddx

※読みやすく改行を加えてます。

PHP7.4.4では廃止されている configure option です。
指定していても無視されます。

No package 'libxml-2.0' found

libxml2-2.9.9をCentOS6にソースインストール

インストールは完了している状態で、
次のようなエラーメッセージのとき

hecking for libxml-2.0 >= 2.7.6... no
configure: error: Package requirements (libxml-2.0 >= 2.7.6) were not met:

No package 'libxml-2.0' found
# 既に定義されてたら加える
echo $PKG_CONFIG_PATH
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libxml2-2.9.9/lib/pkgconfig"

# 未定義ならセットする
echo $PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/usr/local/lib/libxml2-2.9.9/lib/pkgconfig

PHP7.4.4 から --with-libxml-dir が無くなって、$PKG_CONFIG_PATH に変わったってことかな?(必要になったときに調査します)

Class 'ZipArchive' not found

次のようなエラーメッセージのとき

Fatal error: Uncaught Error: Class 'ZipArchive' not found
export PKG_CONFIG_PATH=”$PKG_CONFIG_PATH:/usr/local/lib/libzip-1.6.1/lib64/pkgconfig”

# PHP7.4.0 以降
–with-zip

# PHP7.4.0 より前
–enable-zip

configure を確認します。
デフォルト以外を指定する場合は、export PKG_CONFIG も行います。
本記事の configure のところもご覧ください。