PHP7.3.33をソースインストール / Rocky Linux9.4 on さくらのVPS

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

さくらのVPSにRocky Linux9.4をインストールした覚書です。

今回は、PHP7.3系の最新版である PHP 7.3.33 をソースからインストールします。
PHPの最新版としてはPHP8.3.7 となります。PHP8.3.7をソースインストール / Rocky Linux9.4 on さくらのVPS

ちなみにDNFでのインストールは「CentOS Stream 9 にPHP8.1をDNFでインストール」を参考にしてみてください。

今回のサーバはテストサーバとしての公開を目的としています。いろんな案件のいろんなプロジェクトが入ったサーバになります。
そのためいろんなバージョンのPHPが同居できる必要があります。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

弊社では、2000年台前半頃からPHPを触っている関係で、古いシステムでも解析して扱うことができます。当時の担当者とか制作会社がいなくなったなどで困られた方からの相談を頂くことがよくあります。お気軽にお問い合わせください。

環境

実施日2024-05-17
サーバさくらのVPS 2G
OSRocky Linux9.4
cat /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)

事前準備

いきなりPHPのソースコードをダウンロードしてコンパイルして終わりってできたら良いんですがそういうわけにもいかなく色々準備しておくことがあります。

ソースインストールの準備

configureのために予めインストールしておくものがあります。

dnf install gcc
dnf install autoconf automake libtool
dnf install cmake

古いOpenSSL

PHP 7.3.33 をインストールするにはちょっと古いOpenSSLが必要になります。
こちらを行っていないと make で次のようなエラーになります。

make: *** [Makefile:661: ext/openssl/openssl.lo] エラー 1

バージョンの確認

openssl version
OpenSSL 3.0.7 1 Nov 2022 (Library: OpenSSL 3.0.7 1 Nov 2022)

これはDNFで入れたバージョンでPHPP7.3.33から扱うにはちょっと新しすぎます。

ということで下記を参考に OpenSSL 1.1.1 のインストールを行います。

OpenSSL1.1.1をインストール / Rocky Linux9.4 on さくらのVPS

MySQL

事前にMySQLクライアントとして使うMySQLをインストールしておきます。

MySQL8.4.0をソースインストールする / Rocky Linux9.4 on さくらのVPS

今回は▲の記事でインストールしたMySQLを使っていきます。
まだの場合は先にMySQLをインストールしておきます。

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

PHP7.3.33のダウンロード

サーバに1つのPHPだけだったら、DNF(旧YUM)で入れたら楽なんですが、異なるバージョンのPHPを同居させようとなったらソースからインストールしたほうが融通が利きます。

公式サイトからダウンロードURLを確認

https://www.php.net/downloads

こちらからPHPのソースコードがダウンロードできます。
ただこちらは最新バージョンが対象のページです。

より新しいバージョンが出たときは、同じページの右メニューの一番下に「Old archives」があるのでクリックします。

https://www.php.net/releases/#7.3.33

ということで、こちらがPHP7.3.33です。
この中の「PHP 7.3.33 (tar.gz)」を使います。

https://www.php.net/distributions/php-7.3.33.tar.gz

リンク先を確認すると▲になっているのでこちらを使っていきます。ちなみにGoogle Chromeだったらリンクの上で右クリック「リンクのアドレスをコピー」で取れます。

PHP7.3.33のインストール

設定

DIR_SOURCE=/tmp
PHP_VERSION=7.3.33
PHP_DOWNLOAD_URL=https://www.php.net/distributions/php-$PHP_VERSION.tar.gz
MYSQL_TITLE=mysqlnd
MYSQL_CLIENT=mysqlnd
MYSQLI_CLIENT=mysqlnd
MYSQLPDO_CLIENT=mysqlnd

事前準備

# 確認
ls -la /usr/local/src
ls -la /usr/local/lib

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

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

# 公式サイトからダウンロード
wget $PHP_DOWNLOAD_URL

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

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

sqlite3

sqlite3はオプションで選択できなくなったので準備しておきます。

dnf install sqlite-devel

--with-libxml を付ける場合

dnf install libxml2-devel

--with-openssl を付ける場合

dnf install openssl-devel

--with-curl を付ける場合

dnf install curl-devel

--with-gmp を付ける場合

dnf install gmp-devel

--with-unixODBC を付ける場合

dnf install unixODBC-devel

--with-imap を付ける場合 エラーになった

https://www.php.net/manual/ja/book.imap.php
こちらの関数を使う場合に指定します。

dnf install libc-client-devel

configure

export LD_LIBRARY_PATH=/usr/local/lib/openssl-1.1.1w/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib/openssl-1.1.1w/lib/pkgconfig:$PKG_CONFIG_PATH

openssl はパスを指定します

./configure \
CFLAGS="-fPIE" \
LDFLAGS="-pie" \
--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-gmp \
--with-iconv \
--with-layout=GNU \
--with-kerberos \
--with-unixODBC=shared,/usr \
--with-zlib \
--with-mysqli=$MYSQL_CLIENT \
--with-mysql-sock=$MYSQL_SOCKET_PATH \
--with-pdo-mysql=$MYSQL_CLIENT \
--with-openssl=/usr/local/lib/openssl-1.1.1w \
--with-libzip=/usr/local/lib/libzip-1.10.1 \
--with-system-ciphers \
--without-pear \
--with-gd \
--with-jpeg-dir=/usr \
--with-xpm-dir=/usr \
--with-webp-dir=/usr \
--with-png-dir=/usr \
--with-freetype-dir=/usr \
--enable-zip \
--enable-cgi \
--enable-mbstring \
--enable-cli \
--enable-exif \
--enable-ftp \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--enable-shmop \
--enable-calendar \
--enable-soap
PHP 7.3まで
--enable-zip
--with-gd \
--with-jpeg-dir=/usr \
--with-xpm-dir=/usr \
--with-webp-dir=/usr \
--with-png-dir=/usr \
--with-freetype-dir=/usr \

PHP 7.4以降
--with-zip \
--enable-gd \
--with-external-gd \
--with-jpeg \
--with-xpm \
--with-webp \
--with-freetype \
nginx を使うなら
--enable-fpm

imap を使うなら
--with-imap=/usr
--with-imap-ssl

soap を使うなら
--enable-soap

configure エラー対応

libzip

configureで次のようなエラーが出るときはlibzipが必要です。

checking for libzip... not found
configure: error: Please reinstall the libzip distribution

次のエラーになるときは LD_LIBRARY_PATH が設定されていない可能性があります。

configure: error: off_t undefined; check your library configuration
libzip-1.10.1をソースインストール / Rocky Linux9.4 on さくらのVPS

インストール後はPHPの configure の前に▼をします。

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

インストール

make は 6分程度

make

make test は 10分程度

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

# 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] の上あたりに追記する
# 次の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
# mysql をソースからインストールしている場合はこちら
# MySQL 5.7.34 の場合
sed -i -e "s/^mysql\.default_socket =$/mysql.default_socket = \/usr\/local\/lib\/mysql-5.7.34\/tmp\/mysql.sock/g" /usr/local/lib/php-$PHP_VERSION-mysqlc-$MYSQL_TITLE/php.ini
sed -i -e "s/^mysqli\.default_socket =$/mysqli.default_socket = \/usr\/local\/lib\/mysql-5.7.34\/tmp\/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 = \/usr\/local\/lib\/mysql-5.7.34\/tmp\/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.3.33-mysqlc-mysqlnd/php.ini

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

バージョン

php-7.3.33-mysqlc-mysqlnd -v
PHP 7.3.33 (cli) (built: May 17 2024 23:01:25) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c) 1998-2018 Zend Technologies

PHP-FPM

nginxで php-fpm を使うにはconfigureに --enable-fpm を付けてビルドしておきます。

詳しくは次のページをご覧ください。

nginxとPHP-FPMの設定 - PHP共存版

Apache httpd の設定