PHPのアップグレード
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/php、dev-php/php-cgiと
dev-php/mod_phpは、dev-lang/phpへ統合されました。
SAPIを使用したい場合は、以下のUSEフラグを使用してください。
-
cgi - /usr/bin/php-cgiをビルド & インストールする場合に使用
-
cli - /usr/bin/phpをビルド & インストールする場合に使用
-
apache - Apache 1.3(新しいレイアウト)向けのmod_phpをビルド&インストールする場合に使用
-
apache2 - Apache 2.0(新しいレイアウト)向けのmod_phpをビルド&インストールする場合に使用
上記のUSEフラグを様々にうまく組み合わせて使用できます。ただし、apacheとapache2を同時に使用することはできません。
これらのebuildで最も重要なことは、PHP4とPHP5を同時にインストールすることができることです。
コード表示 2.1: PHPをインストールする |
USE="cli apache2" emerge 'dev-lang/php'
USE="cli apache2" emerge '=dev-lang/php-4*'
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-php4 とdev-php5という、2つの新しいPortageカテゴリが作成されました。
これらのカテゴリは、主にpecl-pdo、pecl-apc、php-java-bridge、xdebugといったPECLパッケージで使われます。
pecl-apcをインストールには、以下のようにします。
コード表示 2.2: PECL::APCのようなPHPの拡張機能をインストールする例 |
emerge dev-php4/pecl-apc
emerge dev-php5/pecl-apc
emerge dev-php4/pecl-apc dev-php5/pecl-apc
|
新規ディレクトリ
-
これらの新しいebuildは、/usr/lib/php4と/usr/lib/php5へ
インストールします(Apache用のモジュールは、Apacheに合わせた正しい場所へ挿入されます)。
-
PEARパッケージとその他のPHPライブラリは、/usr/share/php(以前は、/usr/lib/phpでした)にインストールされます。
-
PECLパッケージは、もはやphp.iniファイルに設定ディレクティブを追加することはしません。
その代わり、[PACKAGE].iniファイルが/etc/php/[SAPI]/extディレクトリに追加されます。
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の拡張機能は、
- PECL-apc
- PECL-imagick
- xdebug
両方のPHPバージョンで独立して使用できるようにするために、
dev-php4とdev-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: 古いパッケージの削除(一例) |
emerge --unmerge php mod_php
emerge --unmerge PECL-apc PECL-imagick xdebug
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フラグの確認(例) |
emerge --pretend --verbose '=dev-lang/php-4*'
emerge --pretend --verbose '=dev-lang/php-5*'
emerge --pretend --verbose dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug
emerge --pretend --verbose dev-php5/pecl-apc dev-php5/pecl-imagick
emerge --pretend --verbose PEAR-PEAR PEAR-Mail PEAR-MDB smarty
|
すべてよければ、PHPをemergeします。
コード表示 3.6: 新しいパッケージをemergeする(例) |
emerge '=dev-lang/php-4*'
emerge '=dev-lang/php-5*'
emerge dev-php4/pecl-apc dev-php4/pecl-imagick dev-php4/xdebug
emerge dev-php5/pecl-apc dev-php5/pecl-imagick
emerge PEAR-PEAR PEAR-Mail PEAR-MDB smarty
|
PHP4とPHP5を同時に使用する場合:cliとcgiバイナリでどちらを使用するか選択する
emergeの後、/usr/lib/php4/binと/または/usr/lib/php5/binに
cliと/またはcgiのバイナリがインストールされます。
PHP4とPHP5を両方インストールする場合、Portageはユーザがどちらを標準として使用するか判断できないので、/usr/binには、最後にインストールしたPHPのバージョンからシンボリックリンクが作成されます。
このため最後にPHP5をインストールした場合、/usr/bin/phpへのシンボリックリンクは、/usr/lib/php5/bin/phpから作成されていることに気づくでしょう。
(phpizeとphp-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バージョンを表示する |
php-select php
php-select php-cgi
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: 希望するバージョンを選択する |
php-select php php4
php-select php-cgi php5
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_pathとextension_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を設定する |
APACHE2_OPTS="-D PHP4"
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を見つけることでしょう。
このドキュメントの内容は
Creative Commons -
Attribution / Share Alikeライセンスです。
|