この記事では、php4 の セッション処理中。フル機能の mysql データベースまたは dbm ファイルベースの セッションを作成する方法に関するガイドを提供します。 ハンドラーの例。
1. はじめに
新規php4 には、セッション 処理関数の独自のセットがあります。デフォルトでは、、の各 セッション は、システム一時ディレクトリ (たとえば、unix システムでは、/tmp) です。
これはニーズに応じて適している場合と適さない場合があります。たとえば、:サーバーが phpweb をサポートしている場合、サーバーは別の場所に分散されます。マシン 、 では、それらの間で セッション を簡単に共有することはできません (もちろん、 >セッションを使用することもできます) は NFS 共有に保存されます。もう 1 つの潜在的な問題は、マシン上のファイル システムが数千または数百万の session ファイルで乱雑であることです。 幸いなことに、php4の開発者は非常に先見の明がある(彼らのおかげです) は、あなたや私のようなユーザーに セッション 処理を拡張するためのインターフェイスを提供します。
このドキュメントでは、セッション について少し説明し、 で動作する 2 つの拡張機能を提供します。 session の処理例。最初の例では、session ハンドラーが session データを DBM ファイル内にあります。 2 番目の例では、セッション データを MYSQL データベースに保存します。
始める前に、ying20000602.zip をダウンロードし、Web に解凍してください。 はドキュメントディレクトリにあります。 (この記事の最後に記載しました) 6 つの
基本関数。これらは php4 の session ハンドラー呼び出しなので、呼び出し方法を心配する必要はありません。 幸いなことに、セッションを処理するこれらのカスタマイズされた関数は、ユーザーにとって完全に透過的です。したがって、独自の PHP スクリプトに影響を与えることなく、それらを変更できます。
これらの関数は です: sess_open($sess_path, $session_name); この関数は、初期化のために session ハンドラーによって呼び出されます。渡す必要がある 2 つのパラメータは $sess_path、 で、php.ini file 🎜>session.save_pathoption;$session_name,php.iniに対応します🎜> session.name オプション。具体的にどのように機能するか 、 以下の例を参照してください。 sess_close();
この関数は、ページが終了し、
セッション ハンドラー シャットダウンが必要な場合に呼び出されます。 (注意: sess_destroy、 と混同しないように注意してください。 end session) sess_read($key);
この関数は
session
ハンドラーは、指定された sessionkey value($key) を読み取ります。 この関数は、$key
として識別される セッション を取得して返します。 Data.(注: データ、が分からない場合でも、データのシリアル化と逆シリアル化の方法について心配する必要はありません。これが何を意味するか、心配しないでください。) 翻訳者注: シリアル化とは、シリアル化とは、変数またはオブジェクトをファイルに保存するプロセスのことです。プログラムまたは必要なときにプログラムを実行するか、必要なときにいつでもデータをメモリに再ロードする技術
、
は、データを保存するだけの方法とは異なります。 sess_write($key, $val);
この関数データは、セッション ハンドラーがデータを保存する必要があるときに呼び出されます。 、これはプログラムの最後によく発生します。
sess_read($key) 機能。 sess_destroy($key);
この関数は セッション を破棄する必要があります。 セッションを削除し、環境をクリアする責任があります。 sess_gc($maxlifetime);
この関数はフラグメントのクリーンアップを担当します。この場合、古い セッション データを削除する必要があります。これらは、セッション ハンドラーによって呼び出されることがあります。
これで、提供する機能について明確に理解できました。このように名前を付ける必要はありませんが、これらのパラメータを受け入れる必要があります。 (必要かどうか ) DBM セッション
ハンドラー
最初の例は、セッション を DBM ファイルに保存するファイルを書き込むことです。 🎜>セッション ハンドラー。 (これは、ying20000602.zip 内の session_dbm.php ファイルです。 >) これを行うには多くの正当な理由があります、たとえば、、あなたが isp共有サーバーがあります(アノテーション:はいわゆる仮想ホストに相当します) そして、セッションデータ
他の人のものと混ぜてください。
重要な注意:
これらのプログラムを試してみると、 php4 には DBM サポートが必要です。このようにならなかった場合 (翻訳注: DBM サポートがなかった場合) それは非常に醜い、本当に醜いでしょう!
私たちがしなければならない作業は セッション データを取得することになります。 DBM ファイル。 (知らなかった場合に備えて、DBM ファイルは保存専用のようなものです " キー / 値 " は非常に単純なデータベース です。
次の 6 関数データ によって実装されます。
sess_open($sess_path, $session_name);dbmopen() を呼び出して、DBM ファイルを読み取り/書き込みモードで開きます。 DBM ファイルは、php.ini を変更しない限り、/tmp/PHPSESSID、 という名前になります。 セッション パス
のパスと名前の設定。
sess_close();
この関数では、単に dbmclose() を呼び出します。 🎜> 関数は、DBM ファイルを閉じます。
sess_read($key);
ここでは、dbmfetch() を呼び出します。パラメータ $key に関連付けられた セッション データを入力します。
セッションをロードするとき、読み取られるものが期限切れのデータではないことを確認する必要があるため、セッション タイムスタンプ付き。
なぜ?期限が切れても、何らかの理由で削除されなかったとしても、古いデータを誤って読み取ることがないからです。これは絶対にダメです。
DBM ファイルは キー/値 はい、そのため、" 値 セッション データを書き込む必要があります>" は と一緒に書き込まれ、セッション データを読み込むときに が削除されます。
期限切れの セッションは無視されます。このソース プログラムを見てください。それがより明確になります。
sess_write($key, $val);
セッションを書き込みます、 dbmreplace() 関数を使用します。上記のことから、有効期限のタイムスタンプを セッション に保存したいため、タイムスタンプを値に結び付ける必要があることに注意してください。 sess_destroy($key);
セッション を破棄するのは簡単です。呼び出すだけです。 dbmdelete() 関数は、session ファイルからそれを削除します。 sess_gc($maxlifetime);
有効期限データの収集はここでは少し面倒ですが必要です ,この目標を達成するために、DBM ファイルに保存されているすべての セッション を周期的にスキャンし、期限切れのファイルを削除します。このファイルに保存されているすべての セッション データをループするため、
が遅くなります。 これで、DBM セッション ハンドラー、とてもクールです
!
ここで、これらの セッション を mysql データベースに保存します。
Mysql セッションハンドラー
(この
次の例は、カスタマイズされた mysql データベースを保存するための 🎜>session ハンドラー。🎜>(これは session_mysql.php ファイル、記事の最後を参照 ) PHP をサポートするサーバーが多数あり、それらの間で
セッションセッション (たとえば、多くのユーザーにサービスを提供し、負荷分散時に を行う必要がある場合) Web/PHP を実行するマシンが多数あり、 をサポートするサーバーとしてマシンのバッチがあります。
php、通常のデータベース サーバー
として 1 台のマシンが必要で、
mysqlDatabase を実行する別のマシンが必要です。処理セッション ほとんどの人 にとって、これが唯一の方法です。致死性が高いと言われています。 :)(注釈: クールすぎるという意味かもしれません)
重要なヒント:
実験する前に、php が mysql をサポートしている必要があります。 (注釈: これはもう問題ないようです。php が mysql に組み込まれました。 サポートされています)これが当てはまらなかったら、状況は本当に醜いものになるでしょう
醜くなる。
まず、mysql に session データベースを作成し、 セッション テーブル。まず、mysql クライアントを実行し、次のコマンドを実行します。 、ON セッションを更新、削除します。* TO phpsession@localhost -> IDENTIFIED BY 'phpsession'; -> mysql> sesskey char(32) not null,
-> 有効期限 int(11) は null ではありません、
-> 値のテキストは null ではありません、
->
次のステップ
、
$SESS_DB の
session_mysql.php ファイルを変更します * 変数は、マシン上のデータベース設定と一致します。続行する前に、すべてが良好であることを確認してください。 6 関数は mysql
データベースに依存します。 work: sess_open($sess_path, $session_name);mysql_Pconnect()、を呼び出してから、mysql_selsect_db()を使用してセッション データベース 。 $sess_path および $session_name パラメーター
は無関係ですが、それらを保つために。 (注釈: オリジナルのテキスト、おそらく互換性のため )
sess_close();
us mysql 永続接続なので、この関数では何も行いません。 (空の関数)
sess_read($key)
トリックは次のとおりです。単純な select ステートメント。指定された $key の sessionデータ、有効期限情報を指定する必要があります。 sess_write($key, $val);
ちょっとしたトリックを使って セッションデータを書き込みます。まず、insert ステートメントを使用して、session データをデータベースに保存しようとしました。 (主キー制約 ) が失敗した場合、この key が、 と書かれている場合、
を update という発言。 sess_destroy($key) セッション を削除するのは簡単です。データベースからキー値を削除するだけです。
sess_gc($maxlifetime);
セッション の有効期限の処理も簡単です, 期限切れの session() をデータベースから削除するだけです。 >php4
は セッション。 この例は、ニーズに合わせて拡張する方法を示しているだけです。バグを見つけた場合は、連絡してください。
を知っています:) よくある質問: セッション
ファイルが心配な場合は、他の仮想ファイルと混合してください
/tmp ディレクトリ内のマシンを別の場所に保存するためです。 session.save_path オプションがあるのはそのためです。
パフォーマンスが心配な場合は、セッションを共有メモリに保存することを検討できます。
(--with-mm)php をコンパイルするときに MM を追加するだけです。 > を指定し、.htaccess で sessio.save_handler を mm として指定します。 、
php.ini または httpd.conf。 データベースは、複数のマシンで セッション を保存する必要がある場合にのみ使用されると思います。
(最後の文は翻訳するのが非常に難しいので、自分で読んでください )
session_dbm.php
== == =============================================== == ===================
/* ------------------ -------- -------------------------------------- -------- --
* session_dbm.php
* ----------------------------- ----------- ----------------------------------
* PHP4 DBM セッション ハンドラー
* バージョン 1.00
* by Ying Zhang (ying@zippydesign.com)
* 最終更新日: 2000 年 5 月 21 日
*
* --------- ---------------------------------------------------- --------- ---
* 利用規約:
* ------------------------ --------- -------------------------------------
*このライブラリはどのような方法でも自由に使用できますが、いかなる保証もありません
* これは私にとってはうまくいきますが、私はそれがうまくいくことを保証しません
* ご自身の責任で使用してください。
*
* 必須ではありませんが、
* このヘッダー情報を変更または改善する場合は、
* までメールで送信してください。イン・チャン
*
* ----------------------------- --------- --------------------------------
* 説明:
* -------- -------------------------------------- --------- ---------------
* このライブラリは、個別のファイルを作成する代わりに、PHP4 セッション ハンドラーに DBM ファイル
* に書き込むように指示します。各セッションごとに
*
*------------------------------------- ---------- ------------------------
* インストール:
* ---- ------------ -------------------------------------- ------------ ------
* DBM サポートが PHP4 にコンパイルされていることを確認してから、この
* スクリプトを残りの部分からアクセスできるディレクトリにコピーします。 PHP
* スクリプト
*
* ---------------------------------- ------------- ------------------------
* 使用法:
* - ------------ -------------------------------------- ------------ --------
* session_start() を呼び出す前に、このファイルをスクリプトに含めます。
* 特別なことをする必要はありませんその後、
*/
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
関数 sess_open($save_path, $session_name) {
グローバル $SESS_DBM;
$SESS_DBM = dbmopen("$save_path/$session_name", "c");
return ($SESS_DBM); > 関数 sess_close() {
グローバル $SESS_DBM ;
dbmclose($SESS_DBM);
戻り値
}
関数 sess_read($key) {
グローバル $SESS_DBM, $SESS_LIFE;
$var = "";
if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0) , strpos($tmp, "|"));
if ($expires_at > time()) {
$var = substr($tmp, strpos($tmp, "|") + 1);
}
}
return $var;
}
関数 sess_write($key, $val) {
グローバル $SESS_DBM, $SESS_LIFE ; $key, time() + $SESS_LIFE . $val);
関数 sess_destroy($key)
dbmdelete($SESS_DBM, $key);
return true;
関数 sess_gc($maxlifetime) {
グローバル $SESS_DBM; $ now = time();
$key = dbmfirstkey($SESS_DBM)
while ($key) {
if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0, strpos($tmp, "|"));
if ($now > $expires_at) {
sess_destroy($key);
}
}
$key = dbmnextkey($SESS_DBM, $key);
}
}
session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy" 、
"sess_gc");
?>
============================================ ======================================
session_mysql.php
=== ================================================= ==================================
/* --------------------------------------------- -------------------------
* session_mysql.php
* ------------ -------------------------------------------------- ----------
* PHP4 MySQL セッション ハンドラー
* バージョン 1.00
* by Ying Zhang (ying@zippydesign.com)
* 最終更新日: 2000 年 5 月 21 日
*
* ------------------------------------------ ----------------------------
* 利用規約:
* ---------- -------------------------------------------------- ------------
* このライブラリはどのような方法でも自由に使用できますが、明示的または黙示的な保証はありません
*。これは私にとってはうまくいきますが、
* あなたにとってうまくいくかどうかは保証しません。ご自身の責任でご使用ください。
*
* 必須ではありませんが、
* このヘッダー情報を保持していただければ幸いです。変更や改善を行った場合は、
* 電子メールで Ying Zhang
*
* -------------------------------------- ----------------------------
* 説明:
* ---------- -------------------------------------------------- ------------
* このライブラリは、セッションごとに個別のファイルを作成するのではなく、MySQL データベース
* に書き込むように PHP4 セッション ハンドラーに指示します。
*
* MySQL に「sessions」という名前の新しいデータベースを次のように作成します。
*
* CREATE TABLE session (
* sesskey char(32) not null,
* 有効期限int(11) unsigned not null,
* value text not null,
* PRIMARY KEY (sesskey)
* );
*
* -------------------------------------- ----------------------------
* インストール:
* ---------- -------------------------------------------------- ------------
* MySQL サポートが PHP4 にコンパイルされていることを確認してください。次に、この
* スクリプトを、残りの PHP
* スクリプトからアクセスできるディレクトリにコピーします。
*
* -------------------------------------- ----------------------------
* 使用法:
* ---------- -------------------------------------------------- ------------
* session_start() を呼び出す前にこのファイルをスクリプトに含めます。
* その後は特別なことをする必要はありません。
*/
$SESS_DBHOST = "ローカルホスト"; /* データベース サーバーのホスト名 */
$SESS_DBNAME = "セッション"; /* データベース名 */
$SESS_DBUSER = "phpsession"; /* データベース ユーザー */
$SESS_DBPASS = "phpsession"; /* データベースのパスワード */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
function sess_open($save_path, $session_name) {
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
echo "
echo "
死ぬ。
}
if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
echo "
死ぬ。
}
true を返します。
}
function sess_close() {
true を返します。
}
function sess_read($key) {
グローバル $SESS_DBH, $SESS_LIFE;
$qry = "セッション WHERE sesskey = '$key' AND 有効期限から値を選択 > " .時間();
$qid = mysql_query($qry, $SESS_DBH);
if (list($value) = mysql_fetch_row($qid)) {
return $value;
}
false を返します。
}
function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;
$expiry = time() + $SESS_LIFE;
$value = addlashes($val);
$qry = "セッション値に挿入 ('$key', $expiry, '$value')";
$qid = mysql_query($qry, $SESS_DBH);
if (! $qid) {
$qry = "セッションを更新 SET 有効期限 = $expiry、値 = '$value' WHERE sesskey = '$key' AND 有効期限 > " .時間();
$qid = mysql_query($qry, $SESS_DBH);
}
$qid を返します。
}
function sess_destroy($key) {
global $SESS_DBH;
$qry = "セッション WHERE sesskey = '$key' から削除";
$qid = mysql_query($qry, $SESS_DBH);
$qid を返します。
}
function sess_gc($maxlifetime) {
global $SESS_DBH;
$qry = "有効期限のあるセッションから削除 < " 。時間();
$qid = mysql_query($qry, $SESS_DBH);
return mysql_affected_rows($SESS_DBH);
}
session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy",
"sess_gc");
?>
============================================ ==========================
test.php
=============== ================================================= =========
/* --------------------------------------------- -------------------------
* test.php
* ------------ -------------------------------------------------- ----------
* PHP4 顧客セッション ハンドラー テスト スクリプト
* バージョン 1.00
* by Ying Zhang (ying@zippydesign.com)
* 最終更新日: 2000 年 5 月 21 日
*/
/* デフォルトは DBM ハンドラー */
if (! isset($handler)) {
$handler = "dbm";
}
/* デフォルトのアクションは増分です */
if (! isset($action)) {
$action = "増分";
}
/* ハンドラーに応じて、適切なセッション処理スクリプトをロードします */
if ($handler == "dbm") {
include("session_dbm.php" );
} elseif ($handler == "mysql") {
include("session_mysql.php");
} else {
echo "
死ぬ。
}
/* セッションを開始し、単純なカウンターを登録します */
session_start();
session_register("カウント");
/* アクションに応じて何をすべきかを判断します */
switch ($action) {
case "increment" :
$count = isset($count) ? $count + 1 : 0;
休憩;
ケース "破棄" :
session_destroy();
休憩;
case "gc" :
$maxlife = get_cfg_var("session.gc_maxlifetime");
sess_gc($maxlife);
休憩;
デフォルト:
echo "
休憩;