本節では、PHPLIBのインストール、検証、レイアウトに関する議論を行います。 PHPLIBをどうやってインストールするか?どんな機能やクラス定義が各ファイルに 含まれているか?PHPLIBがインストールされたWebサーバーのレイアウトはどのよう になるか?インストール時のオプションは何か、そして、そのオプションは性能に どのような影響を与えるか?
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
に依存します。
Auth
は auth.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.inc
のCart
:簡単なショッピングカートを管理します。 商品をカートに入れ、カートを持ち出して、カートの中身を数えることができます。
Session
に依存しています。
prepend.php3
に require("cart.inc")
という
行を加える必要があります。
template.inc
のTemplate
:テンプレートおよび変数置換を管理します。 テンプレートは、ファイルに保存することが可能です。 保存されたテンプレートはいつでもロードすることが可能で、この場合、 変数はこれらのファイルの内容で置換されます。
このクラスは、独立したクラスです。
require("template.inc")
という文を prepend.php3
に
加えるか、このクラスを使用する各ページに手動でこのファイルをインクルードする
必要があります。
HTML ウィジェットは、(フォームや表といった) GUI要素を表示するためのHTMLコードを生成するクラスです。 GUI要素の見かけを容易にカスタマイズできるように アプリケーションで一般に使用される機能を提供することが意図されています。
csv_table.inc
のCSV_Table
:二次元配列またはクエリー結果のダンプをデータベースまたは表計算プログラムでロード可能な CSVフォーマットで作成します。
Table
に依存し、Table
を拡張したものです。
sql_query.inc
のSql_Query
:ユーザーが任意の条件で1つ以上のテーブルカラムを選択できる選択ウィジェットを作成します。 SQLはこれらのセレクションから作成されています。 これは、大きなSQL select文の where 句に使用することができます。
Session
および DB_Sql
に依存します。
require("sqlquery.inc")
文をprepend.php3
に
加える必要があります。
table.inc
のTable
:二次元配列又はデータベースクエリー結果からHTMLテーブルを作成します。 このクラスは配列から指定したカラムを取り出すフィルターとしても 表示したいカラムの名前を明示的に指定することも可能です。 表題をオンにすることも可能です。 生成された全てのHTML要素には、必要に応じてスタイルシートをサポートするために 指定したクラス名のタグが付いています。 フォームタグで使用された場合、各テーブル行は、行の選択を可能とするために チェックボックス入力が前に付加されます。
独立したクラスです。
oohforms.inc
のForm
:機能->値の配列からHTMLフォームを作成します。 このクラスは、あらゆる形式のフォームを一つの構文で作成する手段を提供します。 このクラスは、Javascript およびサーバーサイド認証への容易なアクセス手段を提供し、 静的なデータを表示するためにフォーム要素のいくつかまたは全てを'凍結する'機能を サポートします。 加えて、ライブラリは様々なフォーム要素をオブジェクト指向的に実装しており、 容易に拡張やカスタマイズが可能です。
独立したクラスです。
本ライブラリは、PHP Base Library ダウンロード場所 で提供されています。tar.gz 版とshar 版の2種類の異なったフォーマットが提供されています。
Windows システムを使用している場合、WinZIP をインストールしているとしたら、 最新版の WinZIP は、圧縮された tar アーカイブを処理することができます。 解凍されたファイルは、Windows システムにインストールしたり、UNIXシステムに転送したり することが可能です。
バイナリファイルを処理することができない場合、phplib.shar を
ダウンロードすることが可能です。
このファイルは、自己展開用シェルスクリプトを有するASCII ファイルです。
このファイルを保存し、実行可能とし、UNIXシェルに食わせてください。
(例えば、sh phplib.shar
と入力します)
PHPLIB サポートメイリングリスト
を本ライブラリに関する陥るであろう問題に対して利用することが可能です。
加入するためには、コマンド subscribe
を
メーリングリスト加入用アドレス
に送信して下さい。
本ライブラリは、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_User
が local.inc
の
サンプル設定で定義されます。
しかし、これらの名前はアプリケーション開発者によりカスタマイズすることができます。
PHPLIB はページ管理用の関数として、
page_open()
, page_close
, sess_load()
,
sess_save()
という名前の関数を定義します。
グローバル変数 $_PHPLIB (ハッシュ) が使用されます。
page_open()
が使用されている場合にのみ
デフォルトでライブラリによりグローバル変数が定義されますが、
page_open()
文で要求された各"機能"毎に1つのグローバル
変数が定義されます。
これらは、多くとも $sess
, $user
, $auth
,
$perm
です。
拡張機能または HTML ウィジェットをインクルードした場合、 他のクラス名、関数名、変数がグローバルな名前空間に 定義される可能性があります。
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 に関する問題から ユーザーを保護するものではありません。
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/php
を cgi/php3.ini
に加えて下さい。
設定時にインクルードパスが定義されている場合、既存のインクルードパスに
使用するシステム用のセパレータ(UNIXでは":"、Windowsでは";")を
使用してPHPLIBのインクルードパスを追加して下さい。
インクルードパスの定義自体は、ページにコードをインクルードするわけでは
ありません。この定義は、
require()
および include()
文で参照された
ファイルを探すディレクトリをPHPインタプリタに教えるだけです。
配布ファイルのディレクトリphp
から全てのファイルを
ディレクトリ php
にコピーして下さい。
配布ファイルのディレクトリpages
から全てのファイルを
ドキュメントルートにコピーしてください。
documentation.txt
を手に取り、読んでください。
以下の情報は 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
にあります。
include
または auto_prepend_file
のどちら
を使用するかを決めてください。
ここではauto_prepend_file
を使用し、
auto_prepend_file =
/home/www/servers/phplib.netuse.de/php/prepend.php3
を
php3.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
がこのセッションを反映しているか
を確認して下さい。
メーリングリスト phplib@lists.netuse.de
に加入して下さい。
本文に subscribe
と書いたメールを
phplib-request@lists.netuse.de に送り、
指示に従って下さい。あなたの経験を共有して下さい。
auto_prepend_file=
の替わりにinclude()
を使用する
PHPLIBのコア機能をロードするために auto_prepend_file
を使用したくない場合、
そのクラスのクラス定義を手動でクラスを使用する各ページにロードすることが可能です。
前に概説したように *.inc
ファイルの場所を反映するために
php3.ini
ファイルに正しくinclude_path=
-文を
定義する必要があります。
こうすると、各ページの最初の行にinclude("prepend.php3")
と書くことにより
全てのコア機能をロードすることができます。
性能を更に最適化するために、コア機能の全てを必要としない場合には
先頭に付加するファイルの内容を最小化することが可能です。
auth.inc
, perm.inc
, user.inc
の
機能を必要としない場合には、これらを省略することが可能です。
(これらのクラスは相互に依存していることに注意して下さい!)
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用ディレクティブを置くことが可能です。