2020年2月18日火曜日

【備忘録】PHP7.2.x --> 7.3.14 へのアップグレード(ソースからコンパイル)

PHP のサポート期間について(バージョンごとの一覧表あり)(Qiita)
をみて、PHP 7.2系ってセキュリティサポートが 2020年11月30日なんだよなぁ、別にもう少し後でもいいけど、PHP 7.4 系も出ているし、まずは PHP 7.3 系にしてみるか!ということでやりました。

ローカル環境ではすでに PHP7.3系と7.4系でテストしているので、管理運用している主要なウェブサイトは影響無いことが分かっています。

とはいえ、前回のようにいきなりPHP 7.0.x --> 7.2.7 へのアップグレードをすると、面倒なことが起こる可能性が高いので、まずは1つだけバージョンをあげるかーという感じです。
をみても、特に影響の大きいものはないはず! とはいえ、ソースからコンパイルするので、エラーなくすんなりインストールは出来なかったのでした。まぁ Openssl を標準では使いたくない!ってことで、nginx や postfixは LibreSSLを組み込んでいることがあるのもややこしいところです。

ソースからコンパイルしてインストール


基本的なところは、 PHP 7.0.x --> 7.2.7 へのアップグレード のときと同じです。
./configure に必要なオプションをつけて、

make ZEND_EXTRA_LIBS='-liconv'
make install

で完了。prefixは /usr/local/php-7.3.14 にしているので
/usr/local/php-7.3.14 以下にインストールされます。この時点では既存の PHPには影響しません。

APCu モジュールのインストールと有効化


今回、これがちょっと面倒でした。

cd /usr/local/php-7.3.14/bin
./pecl install APCu

とインストールしようとすると、前回のとき同様エラーになりました。
ただし前回と違ったのは

WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
php: symbol lookup error: /usr/local/php-7.3.14/lib/php/***/openssl.so: undefined symbol: SSL_CTX_set_min_proto_version

というエラーが出たこと。前者は 
pecl channel-update pecl.php.net

として収まりましたが、後者は openssl 絡み(openssl 1.1.0 以上じゃないといけない)なので、そう簡単ではありません。

ということで、前回同様ソースをとってきてインストールすることになりました。

https://pecl.php.net/package/APCu より、5.1.18をダウンロードし

tar -xzvf apcu-5.1.18.tar.gz
cd apcu-5.1.18
/usr/local/php-7.3.14/bin/phpize

のコマンドを実行すると、
Configuring for:
PHP Api Version: 20180731
Zend Module Api No: 20180731
Zend Extension Api No: 320180731
configure.ac:3: error: Autoconf version 2.68 or higher is required
configure.ac:3: the top level

などのエラーがでます。autoconf は yum のパッケージ管理していたので、2.66系なんですよね。仕方がないので、autoconf をソースからインストールすることになりました。

autoconf をソースからインストール


curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar -xzvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
./make
./make install

とまぁこんな感じで、/usr/local/bin/autoconf にインストールされます。
yum パッケージのものは /usr/bin/autoconf にあり、PATHの優先度は /usr/local/bin が上なので、autoconf コマンドは /usr/local/bin/autoconf が今後使われることになります。

autoconf -V
autoconf (GNU Autoconf) 2.69

となれば入ってますね。

そして改めて、APCu のインストールです。
apcu-5.1.18 のフォルダに移動し

/usr/local/php-7.3.14/bin/phpize
./configure --enable-apcu --with-php-config=/usr/local/php-7.3.14/bin/php-config
./make
./make install

として、
Installing shared extensions: /usr/local/php-7.3.14/lib/php/*****/
Installing header files: /usr/local/php-7.3.14/include/php/
と出てきたら、インストール出来ていることになります。

次に APCu が php に組み込まれているか確認します。

/usr/local/php-7.3.14/bin/php -m | grep apcu
apcu
と apcu が出力されれば組み込まれています。

これで PHP-7.3.14 はインストールできたので、あとは既存の PHP-7.2.x との入れ替えです。

PHP 7.2.x から 7.3.14 へのアップグレード手順


 PHP 7.0.x --> 7.2.7 へのアップグレード のときと同じです。

自分が利用としている モジュールが組み込まれていることを確認できれば、 php-fpm サービスを停止して、シンボリックリンクの書き換えをした上でサービスを再起動し、ウェブサービスも再起動しておきます。

今回は php-fpmのログをみていましたが、特に PHP-7.3.14にしたことによるエラーはありませんでした。まぁとはいえ単に PHP を使ったサイトにまだアクセスされていないだけの可能性もあるので、まだしばらくチェックが必要だと思いますけどね。

最後に phpmyadmin などを入れているなら、そこで PHPのバージョンが Web上で変更されていることも合わせて確認しておくとよいでしょう。

2020年2月18日 @kimipooh