ファーストサーバでPEARを使う | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

借りているファーストサーバ にて、PEARを使ったPHPプログラムを書こうと思ったのですが、デフォルトでは入っていない模様。

ってことで、PEARをインストールして使えるまでの設定ログです。


ここでは、「レンタルサーバーのファーストサーバ設定あれこれ 」で書いたのと同様の環境(VPS(仮想専用サーバー)、CentOS5)で試しています。



PEARのインストール


デフォルトの状態では、PEARがインストールされていないようなので、まず始めにpearコマンドをインストールする必要があります。


※ PHPの設定情報(phpinfo)を覗いてみると、「--without-pear」オプションが指定されてインストールされているようです。

  ただ、PEARは独立したPHPのプログラムですので、PHPを再インストールしなくても追加することはできます。


インストールには、管理用システムであるParalles Power Panelから行うのがもっとも簡単です。


※ yumを使ってインストールすることもできますが、デフォルトの状態ではyumコマンドは使えませんし、管理用の

  Paralles Power Panelにてパッケージ類が管理されているため、そちらを使ったほうがサーバー管理上は安全です。


まず、Paralles Power Panelへログインし、左メニューの「パッケージ」を開きます。

次に、中ほどにある「新しいパッケージのインストール」ボタンをクリックし、表示される「名前」欄にpearとでも入力してパッケージを検索、「php-pear」と出てきたら、それにチェックを入れて「インストール」ボタンからインストールができます。


インストールできたかの確認は、サーバーへSSHで接続して


# which pear
/usr/bin/pear

と、pearコマンドのパスが確認できていれば問題ありません。



PEARの必要パッケージのインストール


これは、一般的なPEARの使い方のお話になりますが、PEARをインストールしてもデフォルトでは基本的な幾つかのPEARパッケージのみですので、自分が使いたいパッケージがない場合、後からインストールする必要が出てきます。
PEARパッケージのインストール方法は、

# pear install HTTP


のように、installオプションの後に必要なパッケージ名を指定することでできます。

(上記の場合は、PEARのHTTPパッケージ)


ただ、ファーストサーバ上で初めてパッケージを追加しようとしたら、


WARNING: running in safe mode requires that all files created be the same uid as the current script. PHP reports this script is uid: 0, and current user is: root
WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
sh: /cpp: No such file or directory
pear/HTTP requires PEAR Installer (version >= 1.7.1), installed version is 1.4.9
No valid packages found
install failed


のようなエラーメッセージが表示されたため、とりあえず言われているようにチャネルのアップデートを実行します。


# pear channel-update pear.php.net
WARNING: running in safe mode requires that all files created be the same uid as the current script. PHP reports this script is uid: 0, and current user is: root
Retrieving channel.xml from remote server
Update of Channel "pear.php.net" succeeded

次に、これまた怒られているPEARのバージョンが低いって問題を解決するために、PEAR関連パッケージを一括でアップデートさせます。


# pear upgrade-all

そして、HTTPパッケージのインストールをリトライしてみると、うまくいきました。



ファーストサーバでPEARを利用してみる


で、最大の難関となるのがここ。

PEARが使える状態となり、「いざ!」と思いプログラムに組み込んでみたら・・・


Warning: require_once() [function.require-once]: open_basedir restriction in effect. File(HTTP/Client.php) is not within the allowed path(s): (/var/www/vhosts/localhost.localdomain/httpdocs:/tmp) in /var/www/vhosts/localhost.localdomain/httpdocs/hoge.php on line 3


というようなエラーメッセージが。

調べてみたところ、仮想用ソフトウェアであるPLESKが、php.iniのopen_basedirの値を強制的に上書きして、開くことができるファイルパスを限定してしまっているようです。

PLESKが勝手にApacheに組み込む設定ファイル(httpd.include)を見てみると


<IfModule mod_php5.c>
php_admin_flag engine on
php_admin_flag safe_mode on
php_admin_value open_basedir "/var/www/vhosts/localhost.localdomain/httpdocs:/tmp"
</IfModule>

というように、PHPのopen_basedirオプションを強制的にセットしています。

このオプションにPEARパッケージがインストールされているパスを追加すれば動きそうなのですが、このファイル自体を編集することが禁じられている(このファイルの先頭に「このファイルを編集するなよ、編集した場合、どうなってもしらないからね」的な注釈がついている)ため、安全性をとるなら選択肢としては下記の2択に。


1. ドキュメントルートであるhttpdocsディレクトリ以下にPEARをインストールする

2. /tmp以下にPEARをインストールする


1.は外部からプログラムが実行可能となるのはさすがにリスクが大きいので、2.のtmpディレクトリ以下にPEARをインストールする方法で対処してみたいと思います。


とりあえず、動くかどうかの確認だけであれば、手っ取り早く


1. PEARがインストールされているディレクトリを丸ごと/tmpへコピー(/tmp/pear)

2. php.iniのinclude_pathに、/tmp/pearを追加


で、確認できます。(要Apache再起動)


ただ、このままだとPEARを更新・追加した場合に、インストールディレクトリへ格納される、/tmpは定期的に掃除されるため、PEARパッケージが消える可能性がある、などの問題があります。

って事で、余計な作業になってしまうのですが、上記2点を回避するための対策を。



- PEARパッケージのインストールディレクトリの変更


現在のインストールディレクトリを確認する場合は、


# pear config-show
-snip-
PEAR directory php_dir /usr/share/pear

にて、確認できます。

php_dirがインストールディレクトリを指定するオプションになっていますので、この値を変更します。


# pear config-set php_dir /tmp/pear


- /tmpディレクトリからの定期削除を回避する


/tmpディレクトリ以下に置かれたファイルやディレクトリは定期的に削除されますが、これはtmpwatchコマンドによって実行されています。


※ 詳細は、以前に書いた「不要なファイルやディレクトリを削除できる「tmpwatch」コマンド 」を参照してください。


ですので、そのtmpwatchコマンドの対象から、今回の/tmp/pearディレクトリを除外しておくことで回避できます。


/usr/sbin/tmpwatch -x /tmp/.X11-unix -x /tmp/.XIM-unix -x /tmp/.font-unix \
-x /tmp/.ICE-unix -x /tmp/.Test-unix -x /tmp/pear 240 /tmp
(略)

最後に、-xオプションつきでPEARのディレクトリを指定しておくことで、削除対処のディレクトリから除外されます。



ちょっと無理やりなPEARを使う方法ではありますが、どうしても使いたい場合は今回のような方法でしか、PLESK環境下では利用できなさそうです。