PHPからPostgreSQLに接続してテーブルなどを利用するには、pg_〜という専用の命令を使わなければならない。この場合、途中でPostgreSQLを止めてOracleに移行すると、すべてのPHPスクリプトをOracle用の命令に書き直さなければならない。
PHPLIBを使うと、データベースの違いを意識することなく
PHPスクリプトを作成できる。(本来はセッション管理などを容易に行うためのものらしい・・・)
なお、このページではApache1.x系で説明しているが、Apache2.x系でもちゃんと動くようである。Apache2.x系で設定する場合、/usr/local/apache
を/usr/local/apache2
に読み替えること。
用意したソースを/usr/local/src/phplibに配置し、解凍する。
# mkdir /usr/local/src/phplib-7.4
# cd /usr/local/src/phplib-7.4
# tar zxvf phplib-7.4.tar.gz解凍後、Apacheのディレクトリに移動し、シンボリックリンクを作成する(他のバージョンに簡単に切り替えるため)。
# cd ..
# mv phplib-7.4 /usr/local/apache/
# ln -s phplib-7.4 /usr/local/apache/phplib
PHPLIBはPHP3で使えるように作られているので、PHP4で使えるように修正しながら設定を行う。
まず、PHPLIB内のスクリプトの拡張子が.php3なので、.phpに変更する。非常に多くのファイルがあるため、シェルスクリプトを作成し、一度に作業ができるようにする。
任意のフォルダ(例、/root)にphp32php.shというファイルを以下の内容で作成する。
#!/bin/sh
#ファイルの拡張子.php3を.phpに変更
#ファイルの内容の.php3を.phpに変更
for f in *.php3
do
mv $f `basename $f .php3`.php
done
/usr/bin/perl -pi -e 's|.php3|.php|g' *保存したら、ファイルに実行権をつけ、作業を行う。
# chmod 755 /root/php32php.sh
# cd /usr/local/apache/phplib/php
# /root/php32php.sh
# cd ../pages
# /root/php32php.sh
(adminディレクトリ、menuディレクトリをチェックできないためエラーが出るが、無視)
# cd admin
# /root/php32php.sh
# cd ../menu
# /root/php32php.sh次に、設定ファイル(
prepend.php)を編集する。
# vi /usr/local/apache/phplib/php/prepend.php 「$_PHPLIB["libdir"] = ""; 」という行を探し、次のように修正する。
$_PHPLIB["libdir"] = "/usr/local/apache/phplib/php/";引き続き、「require($_PHPLIB["libdir"] . "db_mysql.inc");」という行を探し、次のように修正する。
require($_PHPLIB["libdir"] . " db_pgsql.inc");上記修正が終われば、変更を保存する。
local.incファイルを、SampleDBデータベースに接続するように編集する。これにより、どのPHPファイルからもlocal.incに設定されているデータベースに接続するようになる。
(この作業はrootで行う)
# vi /usr/local/apache/phplib/php/local.inc 「class DB_Example extends DB_Sql」に続く行を、以下のように修正する。
class DB_Example extends DB_Sql {
var $Host = "サーバのIPアドレス又はホスト名";
var $Database = "SampleDB";
var $User = "nobody";
var $Password = "";
}
PHPスクリプトを実行する際、prepend.phpファイルが自動的にスクリプトの先頭に追加されるよう、php.iniファイルを編集する。
# vi /usr/local/lib/php.ini 「auto_prepend_file = 」という行を探し、次のように修正する。
auto_prepend_file = /usr/local/apache/phplib/php/prepend.php引き続き、「;include_path = ".:/php/includes"」という行を探し、次のように修正する。
include_path = " .:/usr/local/apache/phplib/php/"上記修正が終われば、変更を保存する。以上の設定を反映させるため、Apacheを再起動しよう。
PHPLIBを利用してPHPスクリプトが記述できるかを確認する。以下のスクリプトを作成し、db_select2.phpという名前でドキュメントルートに格納し、ブラウザからブラウズする。
(※赤字の部分は、環境に応じて編集する)
<?php //DenpaDBのクラスを定義 $db = new DB_Example; $db->query("set datestyle to 'ISO';"); ?> <HTML> <HEAD><TITLE></TITLE></HEAD> <BODY> <?php $tbl_name = "テーブル名"; $sql = "SELECT * FROM $tbl_name"; $db->query($sql); while ($db->next_record()) { echo $db->f(1); echo "<BR>\n"; } ?> </BODY> </HTML>エラーメッセージが出ずに、指定した表の1列目のデータが表示されればOK!
※ここで指定するテーブル名は、nobodyユーザがselect権限を持つテーブルでなければならない。
冒頭でも触れたが、PHPLIBは本来、PHP3ではできなかったセッション管理を簡単(?)に実現するためのライブラリである。しかし、PHP4ではセッション管理がサポートされたため、PHPLIBを使う必要性はないと思われる。(実はセッション管理を利用したことがないんです・・・)
私の場合はセッション管理よりも、PHPLIBを使うことによって移植性が高まることに注目して利用している。では、なぜ移植性が高まるのだろうか?1.PHPスクリプトにサーバ名やデータベース名を記述する必要がない
上のサンプルスクリプトを見て分かるとおり、PHPスクリプト自身はサーバ名やデータベース名を持っていない。これは、例えばテストサーバを立ててそのサーバのデータベースにアクセスするスクリプトを作ったとする。PHPLIBを使わない場合、各スクリプトファイルにサーバ名などのデータを持つため、本番稼動で別のサーバとデータベースを使うとき、
全てのスクリプトファイルを編集しなければならない。
ところがPHPLIBを使えば、local.incファイルの設定を変更するだけで、接続先を変更できる。2.違うデータベースに移植する際にも、スクリプトの変更が必要ない
PostgreSQLデータベースに接続するにはpg_connectという命令を利用する。これらpg_〜という各命令は、PostgreSQLに接続するための専用の命令である。データベースサーバとしてずーっとPostgreSQLを使い続けるならそのままでも問題はないが、例えばデータベースをMySqlやOracleに置き換えることになったらどうなるだろうか。
Oracleデータベースへの接続も、やはりOracle専用の命令を使わなければならない。つまり、PHPスクリプトを全て編集しなおさなければならないのだ。しかも、データベース独自の命令もあるため、例えばPostgreSQLにあってOracleにない命令を使っている場合、そのロジックを作り直さなければならなくなる。
PHPLIBを使ったサンプルでは、PostgreSQL独自の命令は使っていない。つまり、接続先データベースが変わっても、スクリプトを編集する必要がないということである。3.コーディング量が少ない
PHPLIBを使ったサンプルには
データベースへの接続・切断の処理がなく、いきなりSQLを発行していることに気がつくだろうか?PHPLIBを使うと、データベースへの接続処理を自動でやってくれるため、つながらなかった場合の処理などを記述する必要がない。よって、PHPLIBを使う場合と使わない場合とでコーディング量がぜんぜん違ってくるため、開発が楽になる。まとめ
以上の理由により、私は(セッション管理を行わなくても)PHPLIBを使っている。
まとめ・2
最近、PHPの
pearを使って同様なことができることを知った。セッション管理を行わないならpearのほうが楽そう。こちらでの設定もそのうち紹介したい・・・