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

PR TIMESデザイナー&エンジニアブログ BREAK TIMES

PR TIMES Developer Blog(デザイナー&エンジニアによる開発者ブログ)

PR TIMES Developer Blog
デザイナー&エンジニアによる開発者ブログ

古いPHPアプリケーションの環境刷新

エンジニアのアカイです。

今回は古い環境で動作している古いWebアプリケーションの対応ということで、
環境を可能な限り新しいものに入れ替える試みです。

古い環境は以下のようになっています。


この状況は、CentOS6の標準rpmをインストールした場合に選択されるものですが、
PHP7も正式にリリースされた今、この環境を使用し続けるのは抵抗があります。

想定している状況は以下の通りです

  • サーバ群をすべて新しい環境へ移行
  • OSは最新のものを使用
  • Apache/PHPはアプリケーションが動作する範囲で最新を選択
  • 上記環境へ移行するためのプログラム修正ができる環境構築

今回はこれらの作業ログになります。

対処すべき内容の確認

PHP公式にバージョン移行のガイドがあります。
関数は仕様変更や非推奨・廃止などがあると思いますので、確認は必須です。

5.3系以前から入れ替える場合、この内容を確認しただけで眩暈がします…

細かいコーディング部分の対応はできた環境で徐々に行うとして、
まず初めにある程度ページを閲覧できる状態にするところまでやりたいと思います。

環境構築

最初に、CentOS6で実行することを想定したchefレシピをそのままCentOS7で動かしてみました。

  * yum_package[php-devel] action install
    - install version 5.4.16-36.el7_1 of package php-devel

そのままではPHPは5.4になるようです(apacheは2.4系です)。

今回の場合は、少なくとも5.6系にはしたいので、phpenvを使用して最初から5.6系をインストールしてしまいます。

実際にはansibleを使用してインストールしましたが、
実行コマンドはおおむね以下のような感じです。

# git clone https://github.com/CHH/phpenv.git
# phpenv/bin/phpenv-install.sh
# cd ; mv .phpenv /usr/local/phpenv
# git clone https://github.com/CHH/php-build.git /usr/local/phpenv/plugins/php-build
# echo -e "export PHPENV_ROOT=/usr/local/phpenv'\nexport PATH=\$PHPENV_ROOT/bin:\$PATH\neval \"\$(phpenv init -)\"" > /etc/profile.d/phpenv.sh
# git clone https://github.com/garamon/phpenv-apache-version.git /usr/local/phpenv/plugins/phpenv-apache-version
# . /etc/profile
# phpenv install 5.6.18
# cp /etc/httpd/modules/libphp5.so /usr/local/phpenv/versions/5.6.18/
# phpenv apache-version 5.6.18

httpd起動は様々な設定を修正しないと動作しない状態でしたが、
なんとか起動・ページの表示を確認できました。


pearの対処について

古いPHPアプリケーションの移行において、これはかなり多い問題のように思います。

基本的には、可能であればすべての部分で廃止・差し替えが望ましいです。

使用せざるを得ない場合、種類が少ない場合でも、
PEARの基本クラス部分に修正が必要になるため、
逐一確認して修正していく必要があります。

また、インストールする場合、pearコマンド/composerが使用できますが、
今回の目的においては避けるべきです。

理由は、pearのライブラリはphp4系向けに作られたものもある状態なので、
パッケージ管理を使用してしまうと、非推奨コードを除去する際に各ツールの管理下にあるコードを変更することになってしまうからです。

現状使用しているものについてはリポジトリ管理下に含めて直接編集し、
追加でパッケージは使用しない方針がよいでしょう。


参考までに、pearをcomposerで管理する場合は以下のようにします。

$ composer config repositories.0 pear http://pear.php.net
$ composer require "pear-pear.php.net/Net_SMTP=*"
$ composer require "pear-pear.php.net/Net_UserAgent_Mobile=*"
$ composer require "pear-pear.php.net/Net_UserAgent_Detect=*"

細かい部分は未検証ですが、具体的な対処は例えば以下のように行いました。


PEAR.php

-function isError($data, $code = null)
+public static function isError($data, $code = null)

-function staticPushErrorHandling($mode, $options = null)
+public static function staticPushErrorHandling($mode, $options = null)

-function staticPopErrorHandling($mode, $options = null)
+public static function staticPopErrorHandling($mode, $options = null)


上記の修正でとりあえずStrictメッセージ等は除去できました。

これで、移行に向けてプログラム修正を行える環境を作成できました。


あまり役に立つ情報はありませんが、バージョンの古い環境はいつか限界を迎えますので、
時間と労力の許す限り、安心できる動作環境を構築する努力をしましょう。