PHPのアップグレード

Andreas Korthaus  Author
Shigehiro IDANI  翻訳

更新日 2006年 3月 19日

1.  はじめに

これまで、何故、まだPortageでPHP5がstableにマークされていないのか?というたくさんの要望がありました。 これはPHP5パッケージ自体の問題ではありません。 PHP5がstableにまだマークされない主たる要因は、PHP5で動作しない、たくさんのアプリケーション、PHPの拡張機能やパッケージがPortageにあり、私たちにはどうすることも出来ないからです。 PHP5は、PHP4との100%完全な後方互換性がなく、すべてのPHP4で開発されたプログラムがPHP5の環境で実行するための移植作業が、できなかったり、されてなかったりしていました。 しかし、たくさんのユーザがこれからも長い間PHP4のサポートを必要としています。

この問題を解決するための解答は、同時に1つのLinux BoxにPHP4とPHP5の環境を同時に提供することです。 しかし、現在のPHPパッケージとeclassのレイアウトでは不可能でした。このため新しいレイアウト、新しいeclass、新しいebuildへ移行するために多大な努力を行う必要がありました。

このドキュメントでは、システムを停止することなくどのようにアップグレードするかを詳細に説明します。

注意: 新しいPHPパッケージは、新しいApacheレイアウトを必要とします。このためApacheをまだ、アップグレードしていない方は、Upgrading Apache(日本語訳)をご覧ください。

2.  変更点

基本的なPHPパッケージの統合

すべてのPHPのebuildであるdev-php/phpdev-php/php-cgidev-php/mod_phpは、dev-lang/phpへ統合されました。

SAPIを使用したい場合は、以下のUSEフラグを使用してください。

上記のUSEフラグを様々にうまく組み合わせて使用できます。ただし、apacheapache2を同時に使用することはできません。

これらのebuildで最も重要なことは、PHP4とPHP5を同時にインストールすることができることです。

コード表示 2.1: PHPをインストールする

(CLIとApache2モジュールに対応した最新バージョンのPHPをインストールする)
USE="cli apache2" emerge 'dev-lang/php'

(PHP4のみをインストールする)
USE="cli apache2" emerge '=dev-lang/php-4*'

(PHP4とPHP5の両方をインストールする)
USE="cli apache2" emerge '=dev-lang/php-4*' '=dev-lang/php-5*'

注意: USEフラグは、このようにセットするのではなく、これから説明するように、/etc/portage/package.useで設定してください。

新しいPortageカテゴリ

新しいPHPのebuildは、dev-phpからdev-lang/phpへ移動しました。 PHP4とPHP5を独立したパッケージとしてインストールできるようにするために、dev-php4dev-php5という、2つの新しいPortageカテゴリが作成されました。 これらのカテゴリは、主にpecl-pdopecl-apcphp-java-bridgexdebugといったPECLパッケージで使われます。

pecl-apcをインストールには、以下のようにします。

コード表示 2.2: PECL::APCのようなPHPの拡張機能をインストールする例

(PHP4向けのAPCをインストールする)
emerge dev-php4/pecl-apc

(PHP5向けのAPCをインストールする)
emerge dev-php5/pecl-apc

(PHP4とPHP5の両方へAPCをインストールする)
emerge dev-php4/pecl-apc dev-php5/pecl-apc

新規ディレクトリ

PHPバイナリへのシンボリックリンク

たとえば、1つ以上のPHPバージョンをインストールする場合を説明します。

コード表示 2.3: PHP4とPHP5をemergeする

USE="cgi cli apache2" emerge '=dev-lang/php-4*' '=dev-lang/php-5*'

ebuildは、/usr/binにインストールされた最後のバージョンのPHPへシンボリックリンクを作成します。 上記の場合、PHP4より後にPHP5がインストールされたので、PHP5へシンボリックリンクが作成されます。 /usr/bin/phpや、/usr/bin/php-cgiではPHP4をリンクしたい場合、または、ある場合にはPHP4、別の場合にはPHP5にリンクしたい場合は、app-admin/php-toolkitで提供されるphp-select toolを使うことができます。php-selectにより、適切なバイナリにシンボリックリンクを簡単に作成できます。

3.  アップグレード手順

アップグレードするためのパッケージを見つける

初めに、アップグレードをするために必要な追加パッケージを特定する必要があります。 app-portage/gentoolkitパッケージに含まれるequeryツールを使用して特定することができます。

コード表示 3.1: dev-phpカテゴリの中でインストール済みパッケージを一覧表示する

$ equery list 'dev-php/'
[ Searching for all packages in 'dev-php' among: ]
 * installed packages
[I--] [  ] dev-php/php-4.4.0 (0)
[I--] [  ] dev-php/mod_php-4.4.0 (1)
[I--] [  ] dev-php/smarty-2.6.10 (0)
[I--] [  ] dev-php/PEAR-PEAR-1.3.5-r1 (0)
[I--] [  ] dev-php/PEAR-Mail-1.1.6 (0)
[I--] [  ] dev-php/PEAR-MDB-1.3.0 (0)
[I--] [  ] dev-php/PECL-apc-3.0.6 (0)
[I--] [  ] dev-php/PECL-imagick-0.9.11 (0)
[I--] [  ] dev-php/xdebug-2.0.0_beta3 (0)

重要: インストール済みパッケージは上記と非常に異なるかもしれません。上記コマンドを自分自身で必ず実行してください。すべてのパッケージを間違いなくアップグレードするように、上記の出力されたリストを保存しておいてください。

注意: 大部分のWebアプリケーションでは、自分自身を適切にインストールする Webアプリケーションeclassを使用しています。 従って、多くのWebアプリケーションは何も影響を受けません。 新しいバージョンがあるかどうか確かめたいかもしれません。

たとえば以下のようなPHPの拡張機能は、

両方のPHPバージョンで独立して使用できるようにするために、 dev-php4dev-php5の2つのPortageカテゴリに別けられています。 さらにこれらのパッケージの大部分は、名前が変更されています。

新しいディレクトリと名前変更された例を以下に紹介します。

PHP拡張機能 以前のパッケージ名 新しいPHP4でのパッケージ名 新しいPHP5でのパッケージ名
APC dev-php/PECL-apc dev-php4/pecl-apc dev-php5/pecl-apc
Imagick dev-php/PECL-imagick dev-php4/pecl-imagick dev-php5/pecl-imagick
Xdebug dev-php/xdebug dev-php4/xdebug dev-php5/xdebug

注意: これらの拡張機能をemergeする前に、再度、どのようにパッケージの名前が変更されているか、/usr/portageの中を調査する必要があります。

以前の古いパッケージを削除する

GentooでPHPの導入方法に関してたくさんの変更が加えられました。 新しいパッケージをインストールする前に、古いPHPパッケージを完全に削除しなければなりません。

コード表示 3.2: 古いパッケージの削除(一例)

(PHPパッケージをunmergeする)
emerge --unmerge php mod_php

(PHPの拡張機能をunmergeする)
emerge --unmerge PECL-apc PECL-imagick xdebug

(PHPライブラリとアプリケーションをunmergeする)
emerge --unmerge PEAR-PEAR PEAR-Mail PEAR-MDB smarty

USEフラグを設定する

いくつかの新しいUSEフラグを追加しましたので、それらを再確認し/etc/portage/package.use(存在しない場合には作成してください)に適切な行を追加したいかもしれません。

注意: /etc/portage/package.useに、PHPのインストールのためのUSEフラグを設定しましょう。 make.confを使ってシステム全体の変更をすることはないことを憶えておいてください。

PHPインストールでサポートしたい機能に即してUSEフラグを設定してください (最低でもcliUSEフラグを設定することを推奨します)。

コード表示 3.3: dev-lang/php向けUSEフラグ(例)

dev-lang/php -* cli apache2 ctype expat fastbuild ftp gd hash iconv memlimit mysql nls pcre pic pdo reflection session simplexml sockets spl ssl tokenizer truetype unicode xml xsl zlib

注意: -*は、すべてのUSEフラグを無効にします(これにより基本的なPHPの機能、Session-、PCRE-、gd-とMySQL-サポートさえも無効になります)。このため使用したいいくつかの機能、拡張機能のすべてのUSEフラグを明確化する必要があります。 詳細は、 Managing Extensionsを参照ください。 preg_* Functionsを使用したい場合はpcreを、Session Handling Functionsを使用したい場合はsessionという様に上位の標準のUSEフラグを設定する必要があります。

並行してPHP4とPHP5をインストールしたい場合、それぞれのバージョンで異なるUSEフラグを設定することができます。

コード表示 3.4: PHP4とPHP5で異なるUSEフラグを設定する(例)

=dev-lang/php-4* -* cli cgi apache2 ctype expat fastbuild force-cgi-redirect ftp gd iconv ipv6 memlimit mysql nls pcre pic posix session sockets ssl tokenizer truetype unicode xml xsl zlib
=dev-lang/php-5* -* cli cgi apache2 ctype fastbuild force-cgi-redirect ftp gd hash iconv ipv6 memlimit mysql nls pcre pic posix pdo reflection session simplexml soap sockets spl sqlite ssl tokenizer truetype unicode xml xmlreader xmlwriter xsl zlib

注意: 推奨するUSEフラグの一覧として、 Recommend USE flagsをご覧ください。PHPで利用可能なすべてのUSEフラグの一覧として、 overlay wikiにあるUSE flags tableをご覧ください。

PHPをemergeする

PHP4のみ、PHP5のみ、同時に両方をインストールするかを選べます。 PHP4のみをインストールする場合には、=dev-lang/php-4*でemergeします。 PHP5(最新)のみインストールする場合には、dev-lang/phpを使用できます。 同時に両方をインストールする場合には、=dev-lang/php-4*=dev-lang/php-5*をemergeします。

USEフラグの設定を確認します。

コード表示 3.5: USEフラグの確認(例)

(PHP4パッケージの確認)
emerge --pretend --verbose '=dev-lang/php-4*'

(PHP5パッケージの確認)
emerge --pretend --verbose '=dev-lang/php-5*'

(PHP4向けの拡張機能の確認)
emerge --pretend --verbose dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug

(PHP5向けの拡張機能の確認)
emerge --pretend --verbose dev-php5/pecl-apc dev-php5/pecl-imagick

(PHPライブラリとアプリケーションの確認)
emerge --pretend --verbose PEAR-PEAR PEAR-Mail PEAR-MDB smarty

すべてよければ、PHPをemergeします。

コード表示 3.6: 新しいパッケージをemergeする(例)

(PHP4パッケージをemergeする)
emerge '=dev-lang/php-4*'

(PHP5パッケージをemergeする)
emerge '=dev-lang/php-5*'

(PHP4向けの拡張機能をemergeする)
emerge dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug

(PHP5向けの拡張機能をemergeする)
emerge dev-php5/pecl-apc dev-php5/pecl-imagick

(PHPライブラリとアプリケーションをemergeする)
emerge PEAR-PEAR PEAR-Mail PEAR-MDB smarty

PHP4とPHP5を同時に使用する場合:cliとcgiバイナリでどちらを使用するか選択する

emergeの後、/usr/lib/php4/binと/または/usr/lib/php5/bincliと/またはcgiのバイナリがインストールされます。 PHP4とPHP5を両方インストールする場合、Portageはユーザがどちらを標準として使用するか判断できないので、/usr/binには、最後にインストールしたPHPのバージョンからシンボリックリンクが作成されます。 このため最後にPHP5をインストールした場合、/usr/bin/phpへのシンボリックリンクは、/usr/lib/php5/bin/phpから作成されていることに気づくでしょう。 (phpizephp-configを使用してPHPの拡張機能をビルドする責任がある)php-develと同様に、あるcliと/またはcgiバイナリは、(/usr/binに)シンボリックリンクが作成されなければなりません。 app-admin/php-toolkitで提供されるphp-selectを使用することで、 簡単に変更できます。

注意: dev-lang/phpは、app-admin/php-toolkitに依存します。 従って、php-selectは、新しいスタイルのPHPパッケージをemergeした後に、 自動的に利用可能になります。

=dev-lang/php-5*と同様に=dev-lang/php-4*をemergeしていると仮定します。 現在、選択されているPHPのバージョンを表示するために、以下で説明するphp-selectコマンドを入力してください。

コード表示 3.7: 現在の選択されているPHPバージョンを表示する

(cli向け)
php-select php

(cgi向け)
php-select php-cgi

(phpizeとphp-config向け)
php-select php-devel

上記、実行結果の一例を示します。

コード表示 3.8: php-selectの出力例

# php-select php
/usr/bin/php is set to /usr/lib/php5/bin/php

この出力結果は、PHP cliバイナリの標準パスの/usr/bin/phpが、 PHP5のバイナリである/usr/lib/php5/bin/phpにシンボリックリンクされていることを意味します。 従って、/usr/bin/phpを使用するPHPスクリプトは、PHP5で実行されます。

標準のPHPを変更するためにphp-selectを使用する

前章で調査した標準のバージョンの設定で満足でない場合、 希望するバージョンを選択するために、再びphp-selectを使用することができます。

コード表示 3.9: 希望するバージョンを選択する

(cliを設定する場合)
php-select php php4

(cgiを設定する場合)
php-select php-cgi php5

(phpizeとphp-configを設定する場合)
php-select php-devel php5

注意: php-selectの機能についてもっと知りたい方はphp-select -hとタイプしてください。

リンクを確認する。

コード表示 3.10: シンボリックリンクを確認する

 # stat /usr/bin/php /usr/bin/php-cgi /usr/bin/phpize /usr/bin/php-config | grep File
 File: `/usr/bin/php' -> `/usr/lib/php4/bin/php'
 File: `/usr/bin/php-cgi' -> `/usr/lib/php5/bin/php-cgi'
 File: `/usr/bin/phpize' -> `/usr/lib/php5/bin/phpize'
 File: `/usr/bin/php-config' -> `/usr/lib/php5/bin/php-config'

注意: php-selectは、標準のバージョンの変更しかできないことに注意してください。 PHP4とPHP5のcgi/cliの両方ともインストールしている場合、 特定のバージョンのPHPスクリプトを実行するために、 /usr/lib/php4/bin/php/usr/lib/php5/bin/phpのように 常に絶対パスで使用することができます。 同じApacheのインスタンス上でPHP4とPHP5のcgiを使用できますが、2つの異なるApache用PHPモジュールを1つのApacheインスタンス上で使用できません。詳細は、 PHP4 and PHP5 Configuration Guideを参照してください。

4.  設定ファイルを移行する

Gentoo PHPパッケージは、 PHPバージョンごと、SAPIごとに1つのサブディレクトリを/etc/phpに作成して、 設定ファイルを保持します。

コード表示 4.1: PHPの設定ディレクトリを一覧表示する

$ ls -1 /etc/php
apache2-php4
apache2-php5
cli-php4
cli-php5

すべてのサブディレクトリには、以前のパッケージのように、それ向けのphp.iniが含まれています。

php.iniの変更

php.iniの古い設定と新しい設定の差分を調べるために、 etc-update、またはdispatch-confを使用すべきです。 確実にチェックする必要がある2つのディレクティブは、 include_pathextension_dirです。 しかし、ここで注意してください。extension_dirは、PHPバージョン間(5.0と5.1でも!)で 異なります。

/etc/php/apache2-php5/php.ini/etc/php/cli-php5/php.iniのPHP5.1の例を示します。

コード表示 4.2: php.iniの古い設定

include_path = ".:/usr/lib/php"
extension_dir = "/usr/lib/php/extensions/no-debug-non-zts-20050617/"

コード表示 4.3: php.iniの新しい設定

include_path = ".:/usr/share/php"
extension_dir = "/usr/lib/php5/lib/php/extensions/no-debug-non-zts-20050617/"

警告: すべてのファイルで正しい設定をするため、必ずetc-updateか、dispatch-confを使用してください。

変更されたPHPの拡張機能の設定

新しいPHPパッケージは、外部(共有)PHP拡張機能用の設定ディレクティブを、もはやphp.iniに保存しません。 これらのディレクティブは、/etc/php/*/extディレクトリに拡張機能固有の設定ファイルで保持されます。 共有拡張機能を有効/無効にするために、/etc/php/*/ext-activeからシンボリックリンクを作成する仕組みが使われます。 拡張機能を有効にする場合は、/etc/php/*/ext-activeから /etc/php/*/ext/の中の、対応する[EXTENSION].iniへシンボリックリンクを作成します。 拡張機能を無効にする場合は、シンボリックリンクを削除します。

以前、dev-php/PECL-apcをインストールしていた場合は、APCの設定は、 php.iniに保存されます。 新しいdev-php5/pecl-apcパッケージを再emergeした場合は、 APCの標準設定は、/etc/php/*5/ext/apc.iniに書き込まれます。

APC設定ディレクティブを/etc/php/*5/php.iniから/etc/php/*5/ext/apc.iniへ移動させる必要があるので、 /etc/php/*5/ext-active/apc.iniから/etc/php/*5/ext/apc.iniへシンボリックリンクを作成します。

注意: ApacheモジュールとしてPHPをインストールした場合は、 インストールと設定の後にApacheを必ず再起動してください。

5.  PHP4と/またはPHP5が動作するようにApacheを設定する

PHP4またはPHP5モジュール(mod_php)を読み込むように、Apacheを設定するには、 /etc/conf.d/apache2の中のAPACHE2_OPTS変数に、 -D PHP4-D PHP5をそれぞれ追加します。

コード表示 5.1: mod_phpを読み込むようにApacheを設定する

(PHP4向けの設定)
APACHE2_OPTS="-D PHP4"

(PHP5向けの設定)
APACHE2_OPTS="-D PHP5"

同時に2つのPHPバージョンをApache上で動作させる方法はたくさんあります。 一番簡単な方法は、cgiバイナリとしてPHP4とPHP5を使用することと、 PHP4はcgiでPHP5はモジュール(または、その反対)で使用することです。 1つのApacheインスタンスで、PHP4モジュールとPHP5モジュールを使うことはできません。

実現可能な手法のいくつかを、PHP4 and PHP5 Configuration Guideの中で説明しています。

6.  サポート/手がかり

新しいGentooのPHPパッケージで問題に直面している場合は、この章で何か手がかりを得ることができるでしょう。

新しいパッケージの実装の詳細については、Stuarts Posting on gentoo-dev 'Radical Changes for PHP5 Support'で始まるStuartsのブログのエントリーを見てください。

Development-Pageでは、 たくさんのドキュメントと、後に公式のPortageツリーへ移行すると思われる一番新しいebuildを見つけることでしょう。