目次

2. 概要およびインストール

本節では、PHPLIBのインストール、検証、レイアウトに関する議論を行います。 PHPLIBをどうやってインストールするか?どんな機能やクラス定義が各ファイルに 含まれているか?PHPLIBがインストールされたWebサーバーのレイアウトはどのよう になるか?インストール時のオプションは何か、そして、そのオプションは性能に どのような影響を与えるか?

2.1 ファイル、クラスおよび関数

PHPLIB は、セッション追跡、セッション毎およびユーザー毎の持続的変数 ユーザ認証、許可属性の確認といった機能を提供する一連の基本クラスと関数を 有しています。この基本機能に基づき構築することにより、PHPLIB では、 一般的に必要とされる "背景" クラスと 簡単にHTMLに基づくユーザーインターフェースが作成できる "HTMLウィジェット"を提供します。

全てのPHPLIBの定義は、ユーザーがこれらのファイルを全く変更する必要が ないように設計されています。 PHPLIBのカスタマイズ用の定義は、local.incおよびsetup.inc、 いくつかのケースではprepend.php3といった設定の仕方によって2つまたは3つの ファイルに記述されています。 PHPLIBの他のファイルは全く変更する必要はありません。細部を以下にまとめます。

カスタマイズ

PHPLIBにおいて通常のアプリケーションで変更を要するのは、次の3つのファイルのみです。

アプリケーションのコンフィグレーションを local.inc で行う:

ほとんどの場合、上位クラスで提供されたデフォルト値ではアプリケーションは 動作しません。アプリケーション毎に以下に記述するようにクラスを拡張する必要があります。

サブクラスで指定する必要があるのは、アプリケーションで異なる部分のみです。 これらは、データベースのホスト名、データベース名、テーブル名、ユーザー名/パスワード の組み合わせといったものです。 例を動作させるためには、ログインスクリーンの定義(HTML)およびユーザー認証関数(SQL) を提供する必要があります。

配布ファイルでは、典型的な設定を行う場合の local.inc を提供しています。 これらの定義は、管理や配布ファイルと共に提供されテスト用スクリプトを実行するためにも 必要です。

このファイルは必須で、セットアップ時に変更する必要があります。

setup.inc によるアプリケーション設定:

Session クラスは、セッションの設定時に初期化用のコードを実行する 機能を提供します。 設定時の動作については、クラスの定義を参照下さい。

規範に沿ってインクルードディレクトリのsetup.incの中にこのようなコードが 保存されています。 このコードは、新規ユーザーの接続がアプリケーションに行われ、新規セッションが 開始される度毎に実行されます。

このファイルはオプションで、デフォルト値は提供されません。

prepend.php3 により自動的にロードされるクラスの選択

ファイル prepend.php3 は、PHP3 に解釈される全てのページに関して ロードされるコードを定義します。 通常、このファイルには次のような全コアクラスのクラス定義を記述します。 db_mysql.inc, session.inc, auth.inc, perm.inc, user.inc, ローカルカスタマイズ用の local.inc , ページ管理用関数の page.inc

使用するデータベースインターフェースに合わせてprepend.php3 を変更する 必要があります。 db_mysql.incを読み込むrequire 文を適当に変更して下さい。

PHPLIBのいくつかのコア機能をアプリケーションで使用しないか 全ページに何らかの他の機能を付加したい場合、 ここにある各インクルードファイルについて require を削除または追加することが可能です。

このファイルは必須で、MySQLを使用しない限り、セットアップ時に変更する必要があります。

基本機能

次のファイルは、prepend.php3 からインクルードされ、 PHPLIBのコアクラスの定義を行います。 これらは、密接な相関を持って構築されたクラスであるため、 これら全てを常にインクルードすることが推奨されます。

クラス DB_Sql は、実際には db_mysql.inc, db_msql.inc, db_pgsql.inc, db_odbc.inc, db_sybase.inc, db_mssql.inc, db_oracle.inc ,db_oci8.inc のどれかで定義されます。 :

使用するデータベースサーバー用のデータベースアクセスクラスです。 PHPLIB は、SQL データベースサーバーの使用を前提にしています。 使用するデータベースサーバーにより、適当なインクするファイルを選択する必要が あります。このファイルは、使用するデータベースサーバー用の クラス DB_Sql の定義を含んでいます。

このクラスは、データベース接続を管理し(接続の設定は暗黙のうちに行われます)、 結果保持用メモリは自動的に管理されます。

独立したクラスです。

クラス Session は、session.inc で定義されています:

スカラー、配列、オブジェクト型の任意の数のセッション変数を管理します。 (オブジェクトをサポートするには、クラスに2つのインスタンス変数を実装することが必要です。) セッションの追跡は、クッキーまたは各URLに get-変数を付加することにより行います。

DB_Sql に依存します。

クラス Authauth.inc で定義されます:

セッション認証を管理します。セッションは、データベースの中で ユーザー名およびパスワードで認証されます。認証に時間制限を設けることが可能です。

Session および DB_Sql に依存します。

クラス Perm は、perm.inc で定義されています:

保護機能付きのセッションページで許可属性の確認を管理します。 保護されたページは指定した権利を有するユーザーのみが閲覧可能です。

Auth, Session ,DB_Sqlに依存します。

クラス User は、user.inc で定義されています:

ユーザー依存の変数を管理します。セッション変数とは異なり、 セッションIDではなくユーザーIDで区別されます。 複数のセッションにまたがる持続性を有していますが、ユーザーが認証された後でのみ でしか利用できません。

Auth, Session, DB_Sqlに依存し、 Session を拡張したものです。

page.incで定義されている関数 page_open() および page_close():

このセットアップおよびシャットダウン関数は全てのセッションページに必要です。

Sessionに依存します。

拡張機能

拡張機能クラスは、HTMLアプリケーションで通常必要とされるGUI無しの背景機能 を提供します。このクラスは、(以下の各クラスで示すように) コア機能を使用しています。

>cart.incCart:

簡単なショッピングカートを管理します。 商品をカートに入れ、カートを持ち出して、カートの中身を数えることができます。

Session に依存しています。 prepend.php3require("cart.inc") という 行を加える必要があります。

template.incTemplate:

テンプレートおよび変数置換を管理します。 テンプレートは、ファイルに保存することが可能です。 保存されたテンプレートはいつでもロードすることが可能で、この場合、 変数はこれらのファイルの内容で置換されます。

このクラスは、独立したクラスです。 require("template.inc") という文を prepend.php3 に 加えるか、このクラスを使用する各ページに手動でこのファイルをインクルードする 必要があります。

HTML ウィジェット

HTML ウィジェットは、(フォームや表といった) GUI要素を表示するためのHTMLコードを生成するクラスです。 GUI要素の見かけを容易にカスタマイズできるように アプリケーションで一般に使用される機能を提供することが意図されています。

csv_table.incCSV_Table:

二次元配列またはクエリー結果のダンプをデータベースまたは表計算プログラムでロード可能な CSVフォーマットで作成します。

Tableに依存し、Tableを拡張したものです。

sql_query.incSql_Query:

ユーザーが任意の条件で1つ以上のテーブルカラムを選択できる選択ウィジェットを作成します。 SQLはこれらのセレクションから作成されています。 これは、大きなSQL select文の where 句に使用することができます。

Session および DB_Sql に依存します。 require("sqlquery.inc") 文をprepend.php3に 加える必要があります。

table.incTable:

二次元配列又はデータベースクエリー結果からHTMLテーブルを作成します。 このクラスは配列から指定したカラムを取り出すフィルターとしても 表示したいカラムの名前を明示的に指定することも可能です。 表題をオンにすることも可能です。 生成された全てのHTML要素には、必要に応じてスタイルシートをサポートするために 指定したクラス名のタグが付いています。 フォームタグで使用された場合、各テーブル行は、行の選択を可能とするために チェックボックス入力が前に付加されます。

独立したクラスです。

oohforms.incForm:

機能->値の配列からHTMLフォームを作成します。 このクラスは、あらゆる形式のフォームを一つの構文で作成する手段を提供します。 このクラスは、Javascript およびサーバーサイド認証への容易なアクセス手段を提供し、 静的なデータを表示するためにフォーム要素のいくつかまたは全てを'凍結する'機能を サポートします。 加えて、ライブラリは様々なフォーム要素をオブジェクト指向的に実装しており、 容易に拡張やカスタマイズが可能です。

独立したクラスです。

2.2 配布ファイルのダウンロード及び展開

本ライブラリは、PHP Base Library ダウンロード場所 で提供されています。tar.gz 版とshar 版の2種類の異なったフォーマットが提供されています。

Windows システムを使用している場合、WinZIP をインストールしているとしたら、 最新版の WinZIP は、圧縮された tar アーカイブを処理することができます。 解凍されたファイルは、Windows システムにインストールしたり、UNIXシステムに転送したり することが可能です。

バイナリファイルを処理することができない場合、phplib.shar を ダウンロードすることが可能です。 このファイルは、自己展開用シェルスクリプトを有するASCII ファイルです。 このファイルを保存し、実行可能とし、UNIXシェルに食わせてください。 (例えば、sh phplib.shar と入力します)

PHPLIB サポートメイリングリスト を本ライブラリに関する陥るであろう問題に対して利用することが可能です。 加入するためには、コマンド subscribeメーリングリスト加入用アドレス に送信して下さい。

2.3 要求と確認事項

インタプリタに対する要求

本ライブラリは、CGIが動作するWebサーバーと PHP 3.0.12 以降がインストールされている 必要があります。 もしくは、 mod_php を使用することが可能です。 古い版のPHPでは全く動作しません。これは、セッションクラスが関数 base64_encode()base64_decode() を使用しており、古い版(3.0.7まで)には既知のバグがあるからです。 また、OOH Forms クラスはコンストラクタ構文を使用していますが、 これは PHP 3.0.5 以降で導入されたものです。 $PHP_SELF 変数と CGI PHP に関する問題は、バージョン 3.0.5 以降で解決されています。 Perl 正規表現関数が Template クラスで使用されていますが、 この関数は実際には 3.0.12 になるまで利用可能ではありませんでした。

注意: CGI PHP を使用している場合、$PHP_SELF が正しい値を有するように --enable-force-cgi-redirect スイッチを付けてコンパイルされている 必要があります。

基本的に、PHP_SELF が $URL の正しいローカル部である場合、 全て動作します。 /cgi-bin のディレクトリ/php が先頭につくように修正されたURLが 含まれている場合、バグの有るバージョンの CGI PHP を使用しています。 PHP のバージョンを更新するか PHPLIB の中にある $PHP_SELF を全て $PATH_INFO に置換して下さい。

注意: PHPLIB では、track_vars 機能を有効にして コンパイルされ、有効とされている必要があります。

注意: PHPLIB では、short_open_tagが有効になっている必要はありません。 本ライブラリは、PHP コマンドの開始記号として常に<?phpを使用しています。

注意: PHPLIB では、magic_quotes_gpcが有効となっている必要はありません。 本ライブラリは、必要な時に常にaddslashes()を使用します。

データベースに対する要求

デフォルトでは、本ライブラリは、 セッション変数の保存用にデータベース接続を要求します。 しかし、インストール時に別の保存手段を選択することにより これを回避することができます。 保存手段には、 現在、SQLデータベース(デフォルト)、 長さ制限付きのSQLデータベース(ct_split_sql.inc)、 システムV共有メモリ (PHPインタプリタがSYSVSHMおよびSYSVSEMをサポートしている 必要があります)、 LDAPサーバー(PHPインタプリタがLDAPをサポートしている必要があります)、 フラットファイル、DBMファイルがあります。

SQLを使用した場合、現在MySQLが完全にサポートされており、PostgreSQL, mSQL, Sybase, Microsoft SQL Server, ODBC , Oracle が制限付きの サポートとなっています。 (制限は、メタデータ情報、例えばテーブル定義等、にアクセスしようとした場合に 限って課されるものです) データベースインターフェースを書くことは難しいことではなく、 自分用のインターフェースを簡単に書くことが可能です。

CGI環境から select,insert, update, delete 権限を有するデータベースサーバー接続が必要です。 同様にCGI環境以外で管理用アカウントから create および drop 権限 が必要です。

PHPLIB のコア機能は、アプリケーションの変数スコープ内に次の2つのテーブルを 必要とします。 active_sessions ( select, insert, update,delete 権限がアプリケーションユーザーに必要。)、 auth_user (select 権限がアプリケーションユーザーに必要。 アプリケーション内部からユーザー管理を行う必要がある場合は、 insert, update, delete 権限がアプリケーションユーザーに必要。)

拡張機能では、他のテーブルも必要になる可能性があります。

名前空間に対する要求

PHPLIB は、コア機能に関して出来るだけ中立な名前空間を構成するように作成されています。 デフォルトではHTMLは生成されず、 グローバルな名前空間において小数の名前しか使用しません。 定義済みのクラス、 DB_Sql, DB_SAM, CT_Sql, Session, Auth, Perm, User に関するクラス名が定義されます。 加えて、クラス名 DB_Example, Example_CT_Sql, Example_Session, Example_Auth, Example_Challenge_Auth, Example_Perm, Example_Userlocal.inc の サンプル設定で定義されます。 しかし、これらの名前はアプリケーション開発者によりカスタマイズすることができます。 PHPLIB はページ管理用の関数として、 page_open(), page_close, sess_load(), sess_save() という名前の関数を定義します。 グローバル変数 $_PHPLIB (ハッシュ) が使用されます。 page_open() が使用されている場合にのみ デフォルトでライブラリによりグローバル変数が定義されますが、 page_open() 文で要求された各"機能"毎に1つのグローバル 変数が定義されます。 これらは、多くとも $sess, $user, $auth, $perm です。

拡張機能または HTML ウィジェットをインクルードした場合、 他のクラス名、関数名、変数がグローバルな名前空間に 定義される可能性があります。

2000年問題への対応

PHPLIB は、使用するデータベースの active_sessions テーブル のカラム changed に date フィールドを使用しています。 changed フィールドは、破棄されたセッションを掃除するための ガベージコレクションに使用されます。date フィールドは YYYYMMDDhhmmss というフォーマットの14文字のフィールドで、 date フィールドは4桁の年を保持しており、 2000年以降も正しく処理することができます。

PHPLIB はクライアントのブラウザにクッキーを設定します。 これらのクッキーは、デフォルトの有効期限はセッションが終わるまでと なっています。このため、これらのクッキーは期限切れにはなりませんが、 ディスクには書きこまれません。日付に関する計算は含まれていません。

Sessionクラスの $lifetime を定義することにより PHPLIBにおいて有効期限を設けてクッキーを設定することが可能です。 これを行った場合、Y2K 問題に対応するかどうかは、 クライアントのブラウザおよびクライアントのオペレーティング システムの日付処理に依存します。 MS-DOS/Windows 3.11 システム上の期限の長いクッキーおよび 全てのブラウザには既知の問題があります。

PHPLIB は、内部的にPHP3 言語の関数mktime()とdate()および UNIX の time_t 型データを使用して日付に関する計算を行います。 32ビットUNIXの time_t 型データは、GMT 1970年1月1日の真夜中から の秒数を数えており、2038 年にはオーバーフローします。

PHPLIB は 2038 年まで動作し、UNIX time_t の時間が拡張されれば それ以降も動作します。 PHPLIB は、PHPLIB アプリケーション、PHP3 インタプリタ、 サーバーのオペレーティングシステム、サーバーソフトウエア、 クライアントブラウザ、クライアントのオペレーティングシステム、 インストールを行った他のソフトウエアにおける日付やY2K に関する問題から ユーザーを保護するものではありません。

2.4 インストール手順

mod_php に関する注意: 次の手順は、モジュール版と同様にCGI版のPHPにも適用されます。 mod_phpを使用している場合、 php3.ini ファイルを強制的に再ロードするために Webサーバーを再スタートする必要があります。

mod_phpを使用している場合、別の設定用オプションが使用可能です。 後節の「mod_php で PHPLIBを使用する」を参照下さい。

ライブラリ設定

次のようにcgiと並列してディレクトリphpを作成して下さい。


/home/www/servers/phplib.netuse.de/pages   <- ドキュメントルート
                                   cgi     <- php バイナリ
                                   php     <- インクルードとプリペンド

このディレクトリ phpをPHP のインクルードディレクトリとして設定して下さい。 具体的には、 include_path = /home/www/servers/phplib.netuse.de/phpcgi/php3.ini に加えて下さい。 設定時にインクルードパスが定義されている場合、既存のインクルードパスに 使用するシステム用のセパレータ(UNIXでは":"、Windowsでは";")を 使用してPHPLIBのインクルードパスを追加して下さい。 インクルードパスの定義自体は、ページにコードをインクルードするわけでは ありません。この定義は、 require() および include() 文で参照された ファイルを探すディレクトリをPHPインタプリタに教えるだけです。

配布ファイルのディレクトリphpから全てのファイルを ディレクトリ php にコピーして下さい。 配布ファイルのディレクトリpagesから全てのファイルを ドキュメントルートにコピーしてください。

documentation.txt を手に取り、読んでください。

データベース MySQL へのアクセス

以下の情報は MySQL のみに適用されます。 現在のところ、他のデータベースサーバーに関する情報は提供されていません。 本節をコピーし、使用するデータベースサーバー用に修正し、 作者に提供して下さい。この情報は、将来のPHPLIBに含まれることになります。

prepend.php3を編集して下さい。 最初にあるrequire()文をrequire("db_mysql.inc"); に変更して下さい。これにより、MySQLデータベースインターフェース がインクルードされます。 (他のデータベース用のインターフェースは、 db_<データベース名>.inc で提供されています。 require() 文にこれを反映する必要があります。)

データベースサーバーの名前が、 database.netuse.de 、CGIユーザーがwebuser であり、 データベース myapp にアクセスすると仮定した場合、 次のようにして下さい。


mysql -h database -u webuser myapp

これが動作しない場合、管理者としてデータベースに接続し、 適当なmysqlアクセス権限を作成して下さい。 配布ファイルのサブディレクトリstuffにある create_database.mysqlを実行し、 データベース active_sessions および auth_user を作成し、同時にサンプルユーザー kris をパスワード test で作成します。 再度、上記のように接続を試みて下さい。 select * from active_sessionsが実行できますか? そして、insert into active_sessions values ("1", "2", "3", "")delete from active_sessions はどうですか? select * from auth_user は実行できますか?

注意: 複数のデータベース用に別のデータベース作成用スクリプトが 配布ファイルのディレクトリ stuff にあります。

PHP ファイルとライブラリのマージ

include または auto_prepend_file のどちら を使用するかを決めてください。 ここではauto_prepend_fileを使用し、 auto_prepend_file = /home/www/servers/phplib.netuse.de/php/prepend.php3php3.ini に加えます。

全てのクラスをprepend.php3で読みこむ必要はなく、 コア機能に関するファイルのみ、つまり、 db_xxx.inc, ct_sql.inc, session.inc, auth.inc, perm.inc, user.inc, local.inc , page.inc を読みこむ必要があります。 本ライブラリは、他の、より重要性の低いクラスも提供し、これらは ページ毎に手動でインクルードすることができます。 いくつかのクラスは、使用時に持続性を有します。 これらのクラスを正常に動作させるためには、 prepend.php3 ファイルでクラス定義をインクルードしておく必要があります。 詳細は、これらのクラスの使用法を参照下さい。

上記の手順を行った後、/index.php3 をアクセスして下さい。 ページを再ロードするとカウンタが増加します。 また、データベースの active_sessions がこのセッションを反映しているか を確認して下さい。

サポート用MLへの加入

メーリングリスト phplib@lists.netuse.de に加入して下さい。 本文に subscribe と書いたメールを phplib-request@lists.netuse.de に送り、 指示に従って下さい。あなたの経験を共有して下さい。

2.5 auto_prepend_file=の替わりにinclude()を使用する

PHPLIBのコア機能をロードするために auto_prepend_file を使用したくない場合、 そのクラスのクラス定義を手動でクラスを使用する各ページにロードすることが可能です。

前に概説したように *.inc ファイルの場所を反映するために php3.ini ファイルに正しくinclude_path=-文を 定義する必要があります。 こうすると、各ページの最初の行にinclude("prepend.php3") と書くことにより 全てのコア機能をロードすることができます。

性能を更に最適化するために、コア機能の全てを必要としない場合には 先頭に付加するファイルの内容を最小化することが可能です。 auth.inc, perm.inc, user.inc の 機能を必要としない場合には、これらを省略することが可能です。 (これらのクラスは相互に依存していることに注意して下さい!)

2.6 mod_php(Apache モジュール)でPHPLIBを使用する

PHP3 をモジュールとして組み込む Web サーバー(具体的にはApache)に PHPLIB をインストールする際には、PHP3 本体の実行用の設定を 行う場所が異なります。 PHP3 のコンパイル時には、多くのパラメータを設定することが可能です。 (phpinfo()のPHPセクションを参照下さい) その多くは、ファイル php3.ini で上書きすることが可能です。 このファイルの位置は、phpinfo()の出力に表示されています。

PHP3 をモジュールとして組み込んでいる場合、 設定を指定する場所の選択肢はより多くなります。 httpd.conf で定義、各ディレクトリのファイル .htaccessで定義、 という順番で設定が上書きされます。 これらのファイルの設定用ディレクティブは、php3.ini のものと同じですが、 Apache 設定用キーワードと干渉しないように前にphp_が付きます。 また、Apache 設定用キーワードと同様に、等号("=")は使用しません。 php3.iniの設定用ディレクティブにx=yとなっていた場合、 Apacheの設定では替わりにphp3_x yとする必要があります。 つまり、キーワードのphp3_を前に付けて、等号を省略する必要があります。 設定用ディレクティブを書き間違えた場合、Webサーバーで500番のエラーが発生します。 Webサーバー用設定のErrorLogで指定したログファイルに エラーに関するより詳細な情報が得られます。

例: 以下では、php3.ini の設定に関する議論を行います。


include_path = "/bla"

mod_php のユーザーは、httpd.confで次のように 別の設定に変更することができます。


<Directory /home/www/servers/phplib.netuse.de/pages>
php3_include_path "/bla"
</Directory>

PHPLIBのユーザーに特に関連するのは、次のディレクティブでしょう。


;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
magic_quotes_gpc = Off    ; magic quotes for incoming 
                          ; GET/POST/Cookie data
magic_quotes_runtime = Off; magic quotes for runtime-generated data,
                          ; e.g. data from SQL, from exec(), etc.
magic_quotes_sybase = Off ; Use Sybase-style magic quotes 
                          ; (escape ' with '' instead of \')
track_vars = On           ; enable $PHP_GET_VARS[], $PHP_POST_VARS[] 
                          ; and $PHP_COOKIE_VARS[] arrays

; automatically add files before or after any PHP 3.0 document
auto_prepend_file = (add path to prepend.php3 here)
auto_append_file  =

;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path      = (add path to the directory with all .inc files)

これらの設定法は、(ISPを運営する場合等で)複数の仮想ホストを管理する場合に 非常に便利です。 この場合、<VirtualHost> ブロックの中か クライアントのディレクトリのファイル.htaccessの都合の良い方に php3用ディレクティブを置くことが可能です。


目次