深入讲解PHP Session及如何保持其不过期的方法
《PHP实战:深入讲解PHP Session及如何保持其不过期的方法》要点: SESSION的实现中采用COOKIE技术,SESSION会在客户端保存一个包含session_id(SESSION编号)的COOKIE;在服务器端保存其他session变量,比如session_name等等.当用户哀求服务器时也把session_id一起发送到服务器,通过 session_id提取所保存在服务器端的变量,就能识别用户是谁了.同时也不难理解为什么SESSION有时会失效了.PHP教程 当客户端禁用COOKIE时(点击IE中的“工具”―“Internet选项”,在弹出的对话框里点击“平安”―“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时 SESSION失效.不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递.windows主机则无此功能.PHP教程 Session常见函数及用法?
警告: 有些类型的数据不能被序列化因此也就不能保存在会话中.包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象).PHP教程 注册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:PHP教程
会话模块支持这两种方法.cookie 更优化,但由于不总是可用,也提供替代的方法.第二种方法直接将会话 ID 嵌入到 URL 中间去.PHP教程 PHP 可以透明地转换连接.除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活.在 Unix 下,用 --enable-trans-sid 配置选项.如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID.PHP教程 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教程 下面是PHP官方关于删除session的案例:PHP教程 <?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教程
解决PHP Session不过期以及SessionId保持不变的问题PHP教程 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'); ?> 欢迎参与《PHP实战:深入讲解PHP Session及如何保持其不过期的方法》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |