当前位置:编程学习 > php >>

PHP session的详细分析

1.PHP session 工作原理
 Session文件储存于服务器端,,默认情况下SESSION 文件保存的目录由session.save_path 指定,文件名以sess_ 为前缀,后跟SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。可以根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录。也就是说,session id是取得存储在服务上的session变量的身份证。
 当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。
 2. Session常见函数及用法
 2.1 Session_start(): 开始一个会话或者返回已经存在的会话。
 这个函数没有参数,且返回值均为true。如果你使用基于cookie的session,那么在使用Session_start()之前浏览器不能有任何输出.可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。
 2.2 注册SESSION变量 :
 PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。注意session_register(),
 session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把
 register_globle设为on,不过出于安全考虑,强烈建议关闭register_globle。
 HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。
 Page1.php
 <?php
 session_start();                           //使用SESSION前必须调用该函数。
 $_SESSION[‘name’]=”我是黑旋风李逵!”;   //注册一个SESSION变量
 $_SESSION[‘passwd’]=”mynameislikui”;
 $_SESSION[‘time’]=time();
 //如果客户端支持cookie,可通过该链接传递session到下一页。
 echo '<br/><a href="page2.php">通过COOKIE传递SESSION</a>';
 //客户端不支持cookie时,使用该办法传递session.
 echo '<br /><a href="page2.php?' . SID . '">通过URL传递SESSION</a>';
 Page2.php
 <?php
 session_start();
 echo $_SESSION['name'];
 echo $_SESSION['passwd'];
 echo date('Y m d H:i:s', $_SESSION['time']);
 echo '<br /><a href="page1.php">返回上一页</a>';
 ?>
 2.3 session_id ([ string $id ] ):Get and/or set the current session id
 php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。
 如果session_id()有具体指定值的话(即指定了参数$id),将取代当前的session_id值。使用该函数前必须启动会话:session_start();
 例子:手动设置Session 的生存期:
 <?php
 session_start();
 // 保存一天
 $lifeTime = 24 * 3600;
 setcookie(session_name(), session_id(), time() + $lifeTime, "/");
 ?>
 其实Session 还提供了一个函数session_set_cookie_params(); 来设置Session 的生存期的,该函数必须在session_start() 函数调用之前调用:
 <?php
 // 保存一天
 $lifeTime = 24 * 3600;
 session_set_cookie_params($lifeTime);
 session_start();
 $_SESSION["admin"] = true;
 ?>
 如果客户端使用IE 6.0 ,session_set_cookie_params(); 函数设置Cookie 会有些问题,所以我们还是手动调用setcookie 函数来创建cookie。
 2.4 检查session是否存在?
 在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用
 isset($_SESSION[‘xxx’])来替代。
 2.5更改session_id session_regenerate_id([bool $delete_old_session]) 更改成功则返回true,失败则返回false。
      使用该函数可以为当前session更改session_id,但默认不改变当前session的其他信息,除非$delete_old_session为true。例如:
 <?php
 session_start();
 $old_sessionid = session_id();
 session_regenerate_id();
 $new_sessionid = session_id();
 echo "原始SessionID: $old_sessionid<br />";
 echo "新的SessionID: $new_sessionid<br />";
 echo"<pre>";
 print_r($_SESSION);
 echo"</pre>";
 ?>
 2.6 session_name() 返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start()之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
 session改名示例:
 <?php
 $previous_name = session_name("WebsiteID");
 echo "新的session名为:$previous_name<br />";
 ?>
 
2.7 如何删除session
 (1) unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。session_unregister()在PHP5中不再使用,可将之打入冷宫。
 unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。
 (2) $_SESSION=array() 删除多个session
 (3) session_destroy()结束当前的会话,并清空会话中的所有资源。该函数不会unset和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
 下面是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的步骤:
 ①session_start()
 ②$_SESSION=array()/unset($_SESSION['xxx'])
 ③session_destroy()
 
3. Session跨页传递问题:
 3.1有两种方法传递一个会话ID:cookie URL 参数
 会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话ID 嵌入到URL 中间去。
 PHP 可以透明地转换页面之间的链接。如果使用低于PHP 4.2的版本,则需要手工在编译PHP 时激活,在Unix 下,用--enable-trans-sid 配置选项。如果此配置选项和运行时选项session.use_trans_sid 都被激活(修改php.ini),相对URI 将被自动修改为包含会话ID。
 Note: 非相对的URL 被假定为指向外部站点,因此没有附加SID,因为这可能是个安全隐患将SID 泄露给不同的服务器。
 另外,也可以用常量SID。如果客户端没有发送会话cookie ,则SID 的格式为session_name=session_id,否则就为一个空字符串。因此可以无条件将其嵌入到URL 中去。
 3. 2 解决session跨页传递问题的三条途径
 ①客户端禁用了cookie。
 ②浏览器出现问题,暂时无法存取cookie
 

补充:Web开发 , php ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,