PHP2におけるセッションの詳しい説明
概要
セッションとは、Webサイトを閲覧する際に、ユーザーがWebサイトに入ってからブラウザを閉じるまでにかかる時間のことで、ユーザーがWebサイトを閲覧する時間でもあります。上記の定義から、セッションは実際には特定の時間の概念であることがわかります。
一般的に、Webサイトのあるページ内の変数(サーバーサイド変数を指します。以下同じ)は、次のページでは使用できません。セッションで扱うのが簡単です。セッションに登録した変数をグローバル変数として利用できます。このようにして、ユーザー ID 認証、プログラム ステータスの記録、ページ間のパラメーター転送にセッションを使用できます。
PHP3版でセッションを実装するにはどうすればいいですか?
PHP3 自体はセッション関数を実装していません。これを実現するには他のメソッドを使用するしかありません。最も有名なのは phplib です。 phplib の最も基本的な機能には、ユーザー認証、セッション管理、権限、データベースの抽象化が含まれます。次に、phplibを使用してセッションを実装する方法を説明します。
1.まずphplibをインストールします(環境はwin2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32です)
まずphplibを解凍します、中に「php」ディレクトリがあるので、このディレクトリをコピーしてくださいApache インストール ディレクトリにコピーします。例: Apache は d:Apache ディレクトリにインストールされており、次に「php」ディレクトリを d:Apache にコピーし、phplib ディレクトリのページ ディレクトリ内のファイルとディレクトリ (ディレクトリ自体を除く) を d:Apachehtdocs にコピーします。
phplib クラス ライブラリはシステムに応じて初期化する必要があります。このファイルにはいくつかの基本パラメータが含まれており、マシンの実際の状況に応じて変更できます。
d:Apachephpprepend.phpファイル内のプログラムを次のように変更します:
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) { $_PHPLIB["libdir"] = "d:/Apache/php/"; //放phplib下php目录的路径 } 修改d:\Apache\php\local.inc文件: class DB_Example extends DB_Sql { var $Host = "localhost"; //mysql数据库所在主机名 var $Database = "test"; //数据库名 var $User = "root"; //数据库用户名 var $Password = "1234567"; //数据库用户密码 }
最後に、phplibディレクトリの下のstuffサブディレクトリにあるcreate_database.mysqlファイルに基づいて初期テーブルを生成します。
phplib を使用するすべてのページは、phplib の実行に必要なクラス ライブラリ ファイルを最初に見つける必要があるため、phplib に prepend.php ファイルが含まれ、auto_prepend を "d :/Apache/" として指定するために、php.ini で auto_prepend 変数を設定できます。 php/prepend.php" (引用符付き) にすると、各ページに phplib クラス ライブラリが自動的にインクルードされます。これらのファイルが見つかるように、phplib クラス ライブラリが配置されているディレクトリを include 変数に追加することもできます。
2. page_open() 関数を呼び出す
phplib を使用するすべてのページでは、まず初期化のために page_open 関数を呼び出す必要があります。
<?php page_open(array("sess" => "Test_Session")); ?>
配列変数 (sess) は、いくつかの状態保存オブジェクトを初期化するために使用されます。ここで注意してください: local.inc で定義されている phplib 組み込み名 (sess) を使用する必要があります。
phplib は Cookie を使用して状態情報を保存するため、ページのコンテンツがブラウザに出力される前に page_open() 関数を呼び出す必要があります。 PHP スクリプトは、関連するステータス データをデータベースに書き戻す page_close() で終わる必要があります。そうしないと、変数が失われます。
3. 具体的な用途。
変数を登録したら、セッションが終了するまで後続のページでその変数を使用できます。メソッド:
register( "varname"); ?>
ここでの varname は変数値ではなく、変数名を最初に指定してから値を割り当てることができることに注意してください。特定のページで変数の値を変更でき、後続のページで変数にアクセスすると、変更された値が取得されます。変数の型は多様で、文字列、数値、配列などがあります。説明すると:
最初のページ:
page_open(array("sess" => "Test _Session"));
$sess->register("welcome"); //変数を登録する $welcome, note 不要$
$welcome="Hello, PHP world!";
…
2ページ目:
page_open();//セッション開始
echo $welcome ;最初のページで定義されているwelcome
page_close();//ステータス情報を保存
?>
変数を登録した後、ページが最後にpage_close()関数を呼び出すと、各セッション変数がデータベースに書き戻されます。 page_close() 関数を呼び出すのを忘れた場合、変数はデータベースに書き戻されず、予期しない結果が生じる可能性があります。変数が使用され、不要になった場合は、次の関数を呼び出して変数を削除できます:
<?php page_open(array("sess" => "Test _Session")); …… $sess->unregister( "variable_name"); …… page_close(); ?>
在PHP4版本中是如何实现session的?
php4的session也靠cookies保存session id,用文件系统保存变量(默认情况下),因此,它的session变量不能保存对象。当然也可以将session保存在数据库中。
在php4中有关session的函数很多(详见php.ini配置一文),通常情况下我们只需要调用三个函数即可:sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一页的最开始处调用session_start()函数, 例如:
<?session_start()?>
<html><body>
<?
$welcome="hello world !";
session_register("welcome");//注册$welcome变量,注意没有$符号
if(session_is_registered("welcome"))//检查$welcome变量是否注册
echo "welcome变量已经注册了!";
else
echo "welcome变量还没有注册!";
?>
</body></html>
php4中session处理的定制
我们需要扩充6个函数:
sess_open($sess_path, $session_name);
这个函数被session处理程序调用来作初始化工作。
参数$sess_path对应php.ini文件中的session.save_path选项
参数$session_name对应php.ini中的session.name 选项。
sess_close();
这个函数在页面结束执行并且session处理程序需要关闭时被调用
sess_read($key);
这个函数在session处理程序读取指定session键值($key)时,检索并返回标识为$key的session数据.(注意:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。)
sess_write($key, $val);
这个函数据在session处理程序需要将数据保存时调用,这种情况经常在程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。
sess_destroy($key);
这个函数在需要消毁session时。它负责删除session并且清除环境。
sess_gc($maxlifetime);
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
定制程序可以用mysql数据库或DBM文件保存session数据,视具体的情况而定。如果使用mysql作支持,那还需要进行以下的步骤:
首先在mysql中创建一个sessions数据库,并且创建一个sessions表:
mysql> CREATE DATABASE sessions;
mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
-> IDENTIFIED BY 'phpsession';
mysql> CREATE TABLE sessions (
-> sesskey char(32) not null,
-> expiry int(11) unsigned not null,
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );
下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置:
<?
$SESS_DBHOST = "localhost"; /* 数据库主机名 */
$SESS_DBNAME = "sessions"; /* 数据库名 */
$SESS_DBUSER = "phpsession"; /* 数据库用户名 */
$SESS_DBPASS = "phpsession"; /* 数据库密码 */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定制函数
session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
定制使用dbm文件时的接口 :
<?
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定制函数
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
session定制的测试代码:
<?php
……
if ($handler == "dbm") include("session_dbm.php");//使用何种接口
elseif ($handler == "mysql") include("session_mysql.php");
else ……
session_start();
session_register("count");
……
?>
認証にSessionを使うには?
ユーザー認証にセッションを使用可能:
ユーザーが正当であるかどうかを確認する:
session_start();
…//検証プロセス
session_register("reguser");
ユーザーがログインしているかどうかを確認する別のページで
session_start();
if(isset($reguser)&&$reguser!=""){// すでにログインしている場合
echo "ユーザー様、ようこそ"
}else{/ /ログインしていない場合
echo "まず登録してください!";
Generationdie / by the user >> 発送操作?
質問: 自分のユニットの購入、販売、在庫システムを作成していたとき、複数のユーザーが同時に php アプリケーションに入力できるようにする必要があることがわかりました。当初設計された静的で一意のセッション ID は、データの混乱を引き起こしました。このようにして、一意のセッション ID を動的に生成することが最優先事項になります。
解決策は簡単です。php ファイル名 + タイムスタンプを一意のセッション ID として使用しました。これにより、プログラム内の各セッションが所定の位置に配置され、混乱がなくなりました。
同じ問題を抱えている友人が解決策を見つけられるように、以下に私のソースコードを公開します。
//変数を保存するために PHP セッションを開始します
$micro = microtime()
$micro = str_replace(" ","",$micro);空白
$micro = str_replace(".","",$micro); // ピリオドを削除します
$mysessionname = "po_maint" .
session_name($mysessionname)
;プログラムのメモ:
ページ間で一意のセッション名の変数を渡すには、mysessionname を使用します。この名前も使用する場合は、上記のプログラムに小さな変更を加える必要があります。 Mysessionname は、セッションの開始前にすでに存在しているため、セッションの内部変数名にすることはできません。複数のセッションが元の Cookie ファイルを確実に上書きするため、Mysessionname を Cookie モードで保存することはできません。非表示のフォームフィールドを使用して保存できます。そうすれば問題はありません。
PHP でのセッションの使用方法の詳細については、PHP 中国語 Web サイトの 2/2 ページの関連記事に注目してください。