深入讲解PHP Session及如何保持其不过期的方法 |
|
本文标签:PHP,Session SESSION的实现中采用COOKIE技术,SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE;在服务器端保存其他session变量,比如session_name等等 。当用户请求服务器时也把session_id一起发送到服务器,通过 session_id提取所保存在服务器端的变量,就能识别用户是谁了 。同时也不难理解为什么SESSION有时会失效了 。 当客户端禁用COOKIE时(点击IE中的“工具”—“Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时 SESSION失效 。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递 。windows主机则无此功能 。 Session常见函数及用法?
警告: 有些类型的数据不能被序列化因此也就不能保存在会话中 。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象) 。 注册SESSION变量 : Page1.php <?php Session_start(); //使用SESSION前必须调用该函数 。 $_SESSION[‘name]=”我是黑旋风李逵!”; //注册一个SESSION变量 $_SESSION[‘passwd]=”mynameislikui”; $_SESSION[‘time]=time(); echo 通过COOKIE传递SESSION; //如果客户端支持cookie,可通过该链接传递session到下一页 。 echo . SID . ">通过URL传递SESSION;//客户端不支持cookie时,使用该办法传递session. ?> Page2.php <?php session_start(); echo $_SESSION[name]; // echo $_SESSION[passwd]; // echo date(Y m d H:i:s, $_SESSION[time]); echo 返回山一页; ?> 有两种方法传递一个会话 ID:
会话模块支持这两种方法 。cookie 更优化,但由于不总是可用,也提供替代的方法 。第二种方法直接将会话 ID 嵌入到 URL 中间去 。 PHP 可以透明地转换连接 。除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活 。在 Unix 下,用 --enable-trans-sid 配置选项 。如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID 。 session_id 检查session是否存在? 更改session_id session_regenerate_id() 更改成功则返回true,失败则返回false 。 <?php session_start(); $old_sessionid = session_id(); session_regenerate_id(); $new_sessionid = session_id(); echo "原始 SessionID: $old_sessionid "; echo "新的 SessionID: $new_sessionid "; echo" "; print_r($_SESSION); echo""; ?> session_name() 返回当前session的name或改变当前session的name 。如果要改变当前session的name,必须在session_start() 之前调用该函数 。注意:session_name不能只由数字组成,它至少包含一个字母 。否则会在每时每刻都生成一个新的session id.
$previous_name = session_name("WebsiteID");
echo "新的session名为: $previous_name
";
?>
如何删除session? session_unset() 如果使用了$_SESSION,则该函数不再起作用 。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了 。 下面是PHP官方关于删除session的案例:
<?php
// 初始化session.
session_start();
/*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除 。****/
$_SESSION = array();
/***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), , time()-42000, /);
}
// 最后彻底销毁session.
session_destroy();
?>
由此我们可以得出删除Session的步骤:
解决PHP Session不过期以及SessionId保持不变的问题 session 回收机制:
gc启动概率 = gc_probability / gc_divisor = 0.1% 下面写的这个session类可以彻底解决session不过期以及sessionid不变的问题 。
<?php
/**
* 扩展Session类(简单封装)
*
* @author slimboy
*
*/
class Session {
/**
* 初始化
*/
static function _init(){
ini_set(session.auto_start, 0);
//Session::start();
}
/**
* 启动Session
*/
static function start() {
session_start();
}
/**
* 设置Session
*
* @param $name Session名称
* @param $value 值
* @param $time 超时时间(秒)
*/
public static function set($name,$value,$time){
if(empty($time)){
$time = 1800; //默认值
}
$_SESSION[$name] = $value;
$_SESSION[$name._Expires] = time() + $time;
}
/**
* 获取Session值
*
* @param $name Session名称
*/
public static function get($name){
//检查Session是否已过期
if(isset($_SESSION[$name._Expires]) && $_SESSION[$name._E
xpires]>time()){
return $_SESSION[$name];
}else{
Session::clear($name);
return null;
}
}
/**
* 设置Session Domain
*
* @param $sessionDomain 域
* @return string
*/
static function setDomain($sessionDomain = null) {
$return = ini_get(session.cookie_domain);
if(!empty($sessionDomain)) {
ini_set(session.cookie_domain, $sessionDomain);//跨
域访问Session
}
return $return;
}
/**
* 清除某一Session值
*
* @param $name Session名称
*/
static function clear($name){
unset($_SESSION[$name]);
unset($_SESSION[$name._Expires]);
}
/**
* 重置销毁Session
*/
static function destroy(){
unset($_SESSION);
session_destroy();
}
/**
* 获取或设置Session id
*/
static function sessionid($id=null){
return session_id($id);
}
}
?>
简单调用:
<?php
//设置session
Session::set(UserId, $userid, 3600);
//读取session
$userId = Session::get(UserId);
?>
|