2007/7/14にPHP4のメンテナンス終了日がアナウンスされ,通常のメンテナンスが2007/12/31まで,セキュリティフィックスが2008/8/8までと発表されました。本連載では,これを踏まえてPHP4.4からPHP5.2への移行について解説します。PHP5には便利な新しい機能が多く追加されていますがここではそれらには触れず,移行についてのみ解説します。PHP4からPHP5に移行する場合に必要のない項目はほとんど解説しません。PHP5の新しい機能についての解説は「はじめてのPHP言語プログラミング入門」(技術評論社)などのPHP5の入門書を参照してください。
特に記述がない場合,PHP4はPHP4.4.x,PHP5はPHP5.2.xを意味します。
PHP4とPHP5の違い
PHP4とPHP5は言語仕様が異なる言語ですが,PHP5はPHP4の上位互換言語です。PHP4とPHP5両方で動作するコードを記述することは難しくありませんが,一部の非互換部分が移行の障害になる場合があります。
主なPHP4とPHP5の違い
- オブジェクト変数がオブジェクトへのハンドルとなった
- オブジェクト指向プログラミングサポートが向上した
- XML関連モジュールが入れ替えられた
- PECL(※1)に移動されたり削除されたモジュールがある
- ※1
- PECLとはPHP Extended C Libraryのこと。PHP本体のソースと一緒に配布されないPHPプロジェクトのモジュールです。
基本的な違いで困る場合もあります。その一例が新しい予約語です。PHP5はオブジェクト思考プログラミング機能が拡張されたため,abstract, public, private, protecedなどが予約語として追加されています。
最終回の「セキュリティ関連の違い」でも一部紹介しますが,PHP4はメンテナンスされているとはいえPHP5に比べて積極的にメンテナンスされてきませんでした。このため,セキュリティ上重要な意味を持つ機能追加であっても,PHP4には追加されていない場合が多くありました。
この記事はPHP4からPHP5への移行をテーマに記述していますが,移行後により安全に利用できるようセキュリティ上重要な変更を最後に解説します。
PHP4とPHP5のバージョン
執筆時点でメンテナンス中のPHP4のバージョンは4.4.7, PHP5は5.2.3です。このバージョン以外のPHPはセキュリティ上の問題も未修整と考えてかまいません。
PHPのバージョンは最初のバージョン番号がメジャーバージョン番号です。このバージョン番号が変わると言語エンジンレベルでの仕様が大幅に変わります。
2つ目のバージョン番号はマイナーバージョン番号です。マイナーバージョンが変わると新しい機能や関数が追加されたり,下位互換性のない修正が行われます。
3つ目のバージョン番号はバグフィックスバージョン番号です。このバージョン番号が変わるとバグが修正されます。基本的には互換性がない変更は行わないことになっています。しかし,エラーとすべき状態でエラーを発生させていなかったのでエラーを発生するよう追加されるなど,プログラムの動作に影響する修正が行われることもあります。
PHPはPHP4,PHP5ともに,新しいマイナーバージョンがリリースされると以前のリリースはメンテナンス対象外になります。つまり,PHP4.4,PHP5.2がリリースされている現在は,PHP4.3,PHP5.1以下はメンテナンスされていません。新しいマイナーバージョンにはセキュリティフィックスが含まれていることがほとんどです。新しいマイナーバージョンがリリースされた場合,できるだけ早くバージョンアップする必要があります。
筆者は新しいマイナーバージョンがリリースされた場合,移行期間の確保のために直前のバージョンについて最低1年はセキュリティフィックスはリリースすべきと考えていますが,残念ながらメンテナンスされていません。Linuxなどのディストリビュータは独自に古いバージョンのメンテナンスも行っていますが,十分とは言えない状態です。安全性が重要なサイトはアプリケーションがPHPの脆弱性によって危険な状態でないか十分注意する必要があります。PHP5.2系を利用するほうがより安全です。
PHPのモジュールとバージョン間の互換性
PHPのモジュールは内部的にZendエンジン(Zend Module API番号,Zend Extension API番号)とPHP本体(PHP API番号)のAPIバージョン番号を保持しています。さらにコンパイル時のデバッグオプションの有効・無効,Zendスレッドセーフティ(ZTSモード)の有効・無効もモジュール内の情報として保持しています。PHP4からPHP5ではZendエンジンのバージョン,PHP本体のAPIバージョン番号も更新されています。
PHPはモジュールをロードする場合,これらのバージョン番号とコンパイルオプションが一致した場合のみモジュールをロードします。つまりPHP4用にコンパイルしたモジュールはコンパイルし直さないとPHP5では利用できません。
ソースが公開されているPECLモジュールやサードパーティーモジュールでPHP5をサポートしていれば,モジュールをPHP5用にコンパイルすればPHP5でも利用できます。しかし,バイナリのみ提供されている商用モジュールなどはPHP5用のモジュールをベンダーから入手しなければなりません。
PHPをソースからビルドしてインストールしたり,PHPパッケージの開発用パッケージ(RPMを利用するの多くのLinuxディストリビューションの場合はphp-develパッケージ)をインストールしている場合は,モジュールのソースディレクトリから以下のようなコマンドでPHPモジュールをコンパイルしてインストールできます。
$ /path/to/phpize # phpizeコマンドは必ずターゲットとなるPHPバージョンに付属のphpizeコマンドを使用する $ ./configure # --with-module_name または --enable-module_nameなどのオプションが必要な場合もある。詳しくは./configure --helpで $ make # コンパイルする $ make install # モジュールディレクトリにインストールする
あとはphp.iniを変更し,インストールしたモジュールをロードするように設定してWebサーバを再起動すれば,新しくインストールしたモジュールが利用できるようになります。

