この章は、PHPLIBのインストールを10分で行うことができるようにするもので、 簡単なテストの手順の概要説明を行い、PHPLIBの機能概要にも触れています。
PHPLIB は、このディレクトリおよび
そのサブディレクトリにあるファイルから構成されます。
PHPLIBは、このディレクトリの
ファイル COPYING
に詳述された
LIBRARY GNU General Public License のもとで
フリーソフトウエアとして利用可能です。
また、PHPLIBは、有用であることを期待して配布されていますが、
「無保証」です。商習慣及び特性の目的に沿ったいかなる暗黙の補償も
行いません。詳細は、ライセンスを参照下さい。
PHPLIB は、PHP アプリケーションの開発者を対象としています。 使用者は、PHP 言語に関して充分な知識、つまり、 少なくともSQLデータベースに関する基本的なノウハウと 本ライブラリを使用可能とするためのWebサーバーの設定法について の基本的な知識が必要です。
本ライブラリは、中型から大型のデータ駆動型のwebアプリケーションを 書く際に有用です。 "中型から大型のアプリケーション"とは、複数回のデータベースクエリーを 行うアプリケーションのことで、 データベースデータから表を作成し、 SQLクエリーを生成するためのユーザーインターフェースや ページやページの機能を充分かつ容易に保護する手段が必要です。 "データ駆動型" のアプリケーションとは、 HTMLコンテンツを作成する際にサポートされるSQLデータベースを利用し、 データベースのトランザクションを駆動するためにHTMLフォームを 使用するアプリケーションのことです。
本ライブラリを利用するには、当然、最近の版のPHPインタプリタを
インストール済みのWebサーバーにアクセスする必要があります。
(本ライブラリのこのバージョンでは、3.0.12以降を推奨します。
また、サポートされるSQLデータベースにアクセスする必要があります。
(現在、PHPLIB は、MySQL, PostgreSQL, mSQL, Oracle 7 および Oracle 8, Sybase,
Microsoft SQL Server ,ODBC データベースをサポートしています。)
使用者についてそのデータベースについてデータベースの作成および破棄が
行える必要があり、Web サーバーのユーザーについては、このテーブルにおいて
SELECT
, INSERT
,
UPDATE
, DELETE
文を実行できる必要があります。
本マニュアルにおいては、MySQL を使用していることを仮定します。 PHPLIB はサポートされるどのSQLサーバーでも実行可能ですが、 PHPLIB の開発には MySQL が使用されています。
PHPLIB は、CGI のPHP やApache に組み込む
mod_php
と組み合わせることが可能です。
CGI版を使用した場合、持続的データベース接続が使用できないため、
全般的な速度に関する影響があります。
我々は個人的には様々な理由
(更新が容易でかつApache suexec
と共に実行可能)
によりCGI版を使用していますが、CGI 版よりも Apache モジュールを推奨します。
PHP 4 はまだβ版です。 β版のソフトウエアに対応したライブラリの開発は行われません。
以下の手順は、PHPLIB を CGI版のPHPにより実行する場合に 適用されるものです。 しかし、多くの記述はmode_php でも同様に有効です。 非常に重要な注意事項: この文章は、Webサーバー、PHPインタプリタ、データベースサーバーを完全に 制御可能な状態でインストールが行われることを想定した 簡易版インストールガイドです。 インストール時に制約が課される レンタル Web サーバーに 関しては適用できません。 完全なインストール手順およびトラブル解決策に関する情報に ついては、この文書の第2章を参照下さい。
PHPLIBをインストールする前に、Webサーバーを起動し、
拡張子 .php3 を付けたファイルを実行してみてください。
その際、<?php phpinfo() ?>
という簡単なスクリプトを
作成してください。
また、"/" で終わる URL に関するデフォルトファイルとして
Webサーバーが index.html
と同様に
index.php3
を認識することを確認して下さい。
(Apache: DirectoryIndex index.html index.php3
)
MySQLデータベースサーバーを入手し、実行して下さい。
空のデータベースをアプリケーション用に作成し、Web サーバープロセスの
所有者から
SELECT
,INSERT
, UPDATE
,
DELETE
命令が使用可能であることを確認してください。
user および db テーブルの変更後に mysqladmin reload
を実行するのを忘れないようにして下さい。
Webサーバーのルートディレクトリと同じレベルに
php
という名前のインクルードディレクトリを
作成して下さい。
このインクルードディレクトリは、Webサーバーのドキュメントルート
の下に置かないで下さい。
PHPLIB 配布ファイルを展開して下さい。
ディレクトリ php
の中身を上記手順で作成した
ディレクトリ php
に移動して下さい。
自分のWebサーバーに関するPHP インタプリタの設定ファイル
php3.ini
を入手し、
include_path
命令が上記の
php
ディレクトリを指すように更新します。
また、auto_prepend_file
命令が
そのインクルードディレクトリの中の
prepend.php3
ファイルを指すように更新します。
php3.ini ファイルを更新することができない場合は、 上記の 非常に重要な注意事項 を読んでいないことになります。
track_vars
が有効であり、
magic_quotes_gpc
が有効になっていることも確認して下さい。
これ以外にもアプリケーションからメールを送信する計画がある場合には、
sendmail_path
も確認することになるでしょう。
多くの UNIX システムでは、このオプションは
/usr/lib/sendmail -t
に設定することにより動作します。
php3.ini ファイルを更新することができない場合は、 上記の 非常に重要な注意事項 を読んでいないことになります。
php
インクルードディレクトリに
cd を行います。local.inc
を編集します。
class DB_Example
にはデータベース接続用の適当なパラメータ
が示されています。
ここで使用するデータベース(MySQL)の場合、
配布ファイル中の create_database.mysql
を実行し、
active_sessions
および auth_user
を作成します。
auth_user
は、名前が kris
、パスワードが test
のサンプルユーザーが入力されて公開されます。
pages
ディレクトリおよび
そのサブディレクトリの内容をドキュメントルートディレクトリに移動します。
クッキーを使用可能にして、Webサーバーの
URL "/" にアクセスします。
index.html
がない場合、index.php3
が表示されます。
ページをリロードした際に、表示される number は増加します。
mysql コマンドクライアントでデータベースに接続し、
select * from active_sessions
を実行します。
自分のブラウザ用のセッションレコードが1つそこにあることを確認し、
ページを再ロードし、select * from active_sessions
を再度行った際に
val
のテキストがどうなるかを見てください。
これが動作している場合、セッションクラスはクッキーモードで動作しています。
次に showoff.php3
にアクセスします。
名前 kris
、パスワード test
でログインします。
active_sessions
を再度確認して下さい。
この時、Example_Session
エントリ (name
カラム参照)
および Example_User
エントリがテーブル中にある必要があります。
両方とも再ロード時に増加します。
クッキーを無効にして再度試してください。 新しいセッションを得ることになり(クッキーは失われます)、 URLのgetパラメータ部にセッションIDを見ることができます。
多くのアプリケーションは、PHPLIB の先進機能を使用しておらず、 PHPLIB をページを保護したり、パスワードを付加する機能に関して 有用であると考えています。 このセクションは、そうした PHPLIB の基本機能を網羅します。
要求に合わせるには
インクルードディレクトリの loginform.ihtml
を編集して下さい。
local.inc
を編集し、
クラス Example_Perm
を自分の許可属性を表す数値に変更して下さい。
auth_user
にあるユーザーは、そのリストの中にカンマで
区切られた1つ以上の名前を有している必要があります。
エラーメッセージを変更するには、
perminvalid.ihtml
を編集して下さい。
配布ファイル中の pages/admin
ディレクトリから
new_user.php3
を使用してください。
インストール手順に従うことにより、
WebサーバーのURL /admin
の下に新規ユーザーが利用可能となります。
マニュアルでユーザーを作成するには、ユーザーIDを得るために
print md5(uniqid("some magic string")
を実行し、
insert into auth_user values (
"得られたユーザーID", "username", "password", "permissions");
を行って下さい。
ページの始めに次のように書きます。
<?php page_open(array("sess" => "Example_Session")); ?>
ページの終わりに次のように書きます。
<?php page_close(); ?>
ページの始めに次のように書きます。
<?php
page_open(
array("sess" => "Example_Session",
"auth" => "Example_Auth",
"perm" => "Example_Perm"));
$perm->check("desired protection");
?>
ページの終わりに次のように書きます。
<?php page_close(); ?>
ページの始めに次のように書きます。
<?php
page_open(
array("sess" => "Example_Session",
"auth" => "Example_Auth",
"perm" => "Example_Perm"));
?>
ページの終わりに次のように書きます。
<?php page_close(); ?>
保護される機能は次のように記述します。
<?php
if ($perm->have_perm("desired protection")):
?>
保護付きのHTMLまたはPHPをここに置きます。
<?php
endif
?>
注意: desired protection
は、
Example_Perm
に記述した許可属性の
組み合わせです。
Example_Perm のデフォルトの値を使用した場合、
"user
", "user,author
" , "admin
" が
有効な値の全てです。
ユーザーは、$perm->check() または $perm->have_perm() コールで
要求された全ての許可属性を有している場合にのみページにアクセス可能です。
注意:
ユーザーは、auth_user
の perms カラムに複数の許可属性を
有することが可能です。
"user,author,editor
" という perms を有するユーザーは
これらの許可属性の組み合わせを要求される全てのページにアクセス可能です。
注意: スペースを使用してはいけません。"user,author,editor
" は動作しますが、
"user, author, editor
" は動作しません。
注意: $auth->auth["uid"]
が
保護付きのページで設定され、かつ
(time < auth->auth["exp"])
の場合にのみ
認証結果は有効になります。
ユーザ名として $auth->auth["uname"]
、
ユニークなユーザーIDとして $auth->auth["uid"]
、
そのユーザーの現在の許可属性として
$auth->auth["perm"]
を使用可能です。
実際、
$auth->auth["perm"]
を直接いじる必要はなく、
情報を得るには $perm->have_perm("...")
を利用します。
この文章を読んでください。次にソースを読んでください。 そして、この文章を再度読んでください。 Session->serialize() と Auth->start() のコードは見難いです。 CVS アカウントを取得し、コードを提供してください。有名になれます。 フェラーリのように。
注意: どんな変数が登録されるかを知りたい。 フォーム変数とセッション変数がページにインポートされる 順番を理解したい。 フォーム変数からセッション変数に値がそれ自体の値を失わずに どのようにコピーされるかを理解したい。 持続的なフォーム変数を作成したくない。 このような場合には、上記のようにすると幸せな生活をおくることができます...
以下の手順は、PHPLIB を CGI PHP と実行する場合に適用されます。 しかし、手順の多くは mod_php でも有効です。 この節は、上記のインストール手順が失敗した場合に、 インストール時の問題を基本的なところから検討することにより 見つける手法を示します。
サポート用のメーリングリストがアドレス
phplib@lists.netuse.de
にあります。このリストに加入するには、
コマンド subscribe
をアドレス
phplib-request@lists.netuse.de
に送付して下さい。
Webサーバーが起動しているか、
設定した仮想ホストが動作しているかを確認して下さい。
これを行うには、
小さなファイル test1.html
を DocumentRoot に作成し、
test1.html
により Web サーバーにアクセスしてみて下さい。
Webサーバーが起動し、CGIが実行できることを確認して下さい。 現在のディレクトリ、実行するプログラムの UID/GID を確認し、 環境変数を見て下さい。 次のシェルスクリプトをインストールして下さい。
#! /bin/sh --
echo "Content-Type: text/plain"
echo
id
echo
pwd
echo
env | sort
echo
これをCGI用ディレクトリにcgi-test
という名前で置き、
ドキュメントルートに cgi-test.cgi
という名前で置いて下さい。
実行許可を与えて下さい。
/cgi/cgi-test?par1=one&par2=two
および
/cgi-test.cgi?par1=one&par2=two
にアクセスし、
出力を確認して下さい。
実行ユーザーの UID/GIDは、pwd
の出力は、設定されている環境変数は?
QUERY_STRING
はどのようになっていますか?
PATH
変数はどうなっているか、
LD_LIBRARY_PATH
変数はどうなっているか、
PHP により必要とされる全てのライブラリがCGI環境で実行中のPHPにより
アクセス可能であるか
(PHP上でUNIX ldd
コマンドを実行することにより確認します)
を確認下さい。
特に、Oracle サポート機能をPHPに組込み、
libclntsh
を動的にリンクしている場合、
そのライブラリはCGI環境からロード可能ですか?
そうでない場合、
PHPは次のステップに進むことはできません。
PHPバイナリをCGIバイナリ用ディレクトリにコピーしてください。
(このディレクトリはDocumentRoot以下に置くべきではありません!)
そして、実行可能にして下さい。
php3.ini
を同じディレクトリにコピーしてください。
DocumentRoot に test2.php3
を作成し、<?php phpinfo() ?>
と中に書いて下さい。
Apache を実行していますか? その場合は、次の記述を設定ファイルに加えてください。
Action php3-script /cgi/php
AddHandler php3-script .php3
DirectoryIndex index.php3 index.html index.htm
FancyIndexing on
これにより、
.php3
で終わるファイルへの全てのリクエストは
php3-script
ハンドラにマップされ、
内部的にリクエスト php3-script
を処理するURLとして
/cgi/php
が定義されます。
/test2.php3
へのリクエストを行い、
実行されているかを確認して下さい。
(いくつかの色の定義に関して) php3.ini
を変更し、再ロードして下さい。
その変更は、phpinfo()
の出力に反映されていますか?
そうでない場合、その php3.ini
は見つけられおらず、
問題があります。
適当な設定を行い再コンパイルして下さい。
phpinfo()
の出力を注意深く確認して下さい!
PHP は最新版ですか?
(このリリースは PHP 3.0.12 で開発され試験されています)
使用するデータベースインタフェースがphpinfo()
の出力に
表示されていますか?そうでない場合は再コンパイルして下さい。
同様にURL /cgi/php/test2.php3
として/test2.php3
にアクセスすることができますか? 出来る場合は、
--enable-force-cgi-redirect
を付けて PHP インタプリタが
コンパイルされていません。
PHPLIB は、このインタプリタでは動作しません。
このスイッチを付けて再コンパイルして下さい。
サーバーが既に正確に設定されていることを仮定し
(srm.conf
中にPHPに関する記述を書くことを忘れないで下さい!)、
次のファイルを入力し、DocumentRoot にtest2.php3
として保存します。
<? phpinfo() ?>
webブラウザを用いてこのファイルにアクセスできる場合、 PHP、Apacheおよびその環境についての多くの情報を得ることができるはずです。
PHPはPHPLIBを正しく読みこんでいますか?
php3.ini
ファイルを確認して下さい。
このファイルに次のように設定を行っておく必要があります。
include_path = 全ての .inc ファイルがあるディレクトリへのパス名
auto_prepend_file = prepend.php3 へのパス
track_vars = On
次の設定も記述する必要があります。
magic_quotes_gpc = On
PHPLIBが適当に設定されている場合、次のページはエラーなく実行可能です。
<?php
$db = new DB_Example;
print "It works without error messages.<br>\n";
?>
PHPLIB のインストールには、local.inc
が正しく設定されている必要が
あります。
特に、提供されたクラス DB_Example
は使用するデータベース接続に
合わせてカスタマイズする必要があります。
Webサーバーが次のページのデータベースをアクセスできるかどうかテストして下さい。
<?php
include("table.inc"); // 動作させるには、include_path に記述する必要があります。
$db = new DB_Example;
$db->query("select * from auth_user");
$t = new Table;
$t->heading = "on";
$t->show_result($db);
?>
正しく実行された場合、このページには、テーブル auth_user
から
kris
に関するユーザーエントリにパスワード test
、
許可属性 admin
が表示されます。
そうならない場合、local.inc
の DB_Example
の定義が
壊れています。
配布ファイルと共に提供されているページ /index.php3
を
アクセスして下さい。
このページは、ブラウザにクッキーを設定します。クッキーの設定を許可して下さい。
このページは、カウンタ付きのヘッドラインを表示します。
ページを再ロードしてください。カウンターは増加するはずです。
増加しない場合、ブラウザがクッキーを正しく処理できないか、PHPLIBが
データベースのテーブル active_sessions
を正しく読み書き
できていないかのどちらかです。
phpinfo()
の出力を見てクッキーが設定されているかどうかを
確認して下さい。
(4番目のテーブルにクッキーと他のコール毎のデータが表示されます。)
コマンドラインからデータベースに接続し、データベースの許可属性を確認して下さい。
配布ファイルで提供されている /showoff.php3
をロードしてみてください。
このページはログインを要求します。
kris
としてパスワード test
を用いてログインして下さい。
ログインが成功したら、
セッション毎のカウンタとユーザー毎のカウンタを再度見て下さい。
ページを再ロードして下さい。
カウンタは増加するはずです。
ログインできない場合、おそらくクッキーに問題があります。
ブラウザがセッションクッキーを受け付け送信することを再度確認して下さい。
他の問題としては、テーブル auth_user
へのアクセスが
考えられます。
このテーブルに対してSELECT
が可能である必要があり、
ログインするユーザーのエントリを有している必要があります。