php里session的用法(超级经典)php
综述
Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所通过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中咱们能够看到,Session其实是一个特定的时间概念。
通常来讲,在网站上某一个页面中的变量(指服务器端变量,下同)是不能在下一页中用的,有了session就好办了。session中注册的变量能够做为全局变量使用。这样咱们就能够将session用于用户身份认证,程序状态记录,页面之间参数传递。
在PHP3版本中是如何实现session的?
php3自己是没有实现session功能的,咱们只有用其余的方法来实现,这其中最有名的要算phplib了。phplib最基本的功能包括用户认证、Session管理、权限及数据库的抽象化。html
下面咱们就讲述一下如何用phplib实sessionmysql
VGGGGhttp://hiphotos.baidu.com/sunrat/pic/item/b1b5ab0635fae6cd4e8294fe0fb30f2443a70f9d.jpgGGGGsql
一、首先安装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目录的pages目录下(不包括目录自己)的文件和目录一块儿拷贝到d:\Apache\htdocs下。
phplib的类库须要根据系统进行初始化,可能须要修改local.inc文件,其中包含着一些基本参数,能够根据本身机器的实际状况来进行修改。
将d:\Apache\php\prepend.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所必需的类库文件,咱们能够在php.ini中设置auto_prepend变量来支持,phplib中包含一个prepend.php文件,并将auto_prepend指定为"d:/Apache/php/prepend.php"(带引号)后,各页面就会自动包含phplib类库,咱们还能够将phplib类库所在目录加进include变量中,以即可以找到这些文件。
二、调用page_open()函数
在每个使用phplib的页面中,必须首先调用page_open函数进行初始化,例如:
<?php
page_open(array("sess" => "Test_Session"));
?>
数组变量(sess)用来初始化一些状态保存对象,这里应该注意:必须使用phplib内置名(sess),这些内置名是在local.inc中所定义的.。
由于phplib使用了Cookies来保存状态信息,因此page_open()函数必须在页面内容输出到浏览器以前被调用。php脚本最后应以page_close()结束,这将会将有关状态数据写回到数据库中,不然变量会丢失。
三、具体使用。
注册一个变量后便可在随后的页面中使用它,直至session结束。方法:
<?php $sess->register( "varname"); ?>
注意,这里的varname不是变量值,而是变量名,能够先指定变量名,随后再赋值。你在某个页面中能够改变变量的值,随后的页面访问该变量时会获得改变后的值。变量的类型是多样的,能够是一个字符串,一个数字,一个数组。举例来讲明:
第一页:
<?php
page_open(array("sess" => "Test _Session"));
$sess->register( "welcome"); //注册变量$welcome,注意不须要加$
$welcome="Hello,PHP world!";
……
page_close();
?>
第二页:
<?php
page_open();//开始session
echo $welcome;//显示第一页中定义的$welcome
page_close();//保存状态信息
?>
注册完一个变量,当页面最后调用page_close()函数后,各个session变量会被写回到数据库中。若是忘记调用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能够用于用户认证 :
验证用户是否合法:
<?
session_start();
……//验证过程
session_register("reguser");
?>
在另外一页面中检查用户是否登陆
<?
session_start();
if(isset($reguser)&&$reguser!=""){//若是已经登陆
echo "亲爱的用户,欢迎你";
}else{//若是没有登陆
echo "请先注册!";
}
?>
用户退出登陆:
<?
session_destroy();
……
?>
如何实现多session并发运行?
问题提出:我在为所在单位编写一个进销存系统中发现须要让多个用户能够同时进入一个php应用程序。原来设计的静态的惟一的session ID致使数据混乱。这样,动态生成一个惟一的session ID成为当务之急。
解决办法很简单:我用了php文件名+时间戳为惟一的session ID,这样在个人程序中的每一个session就各就各位,再也不混乱了。
下面把个人源代码公布,方便也有一样的问题的朋友多一个解决方法。
//Start a PHP session to preserve variables.
if ( empty($mysessionname) ) {
$micro = microtime();
$micro = str_replace(" ","",$micro); // strip out the blanks
$micro = str_replace(".","",$micro); // strip out the periods
$mysessionname = "po_maint" . $micro;
}
session_name($mysessionname);
session_start();
程序注释:
用mysessionname为页面间惟一的sessionname传递变量,若是你也用到这个名字必须把上述程序作个小小的改动。Mysessionname不能为session的内部变量名,由于他在session开始以前就已经存在了。Mysessionname也不能用cookie方式存放,由于多个session确定会覆盖掉原先的cookie文件。你能够用隐含表单的域来保存它。这样就不会有问题。
数据库