`
dcj3sjt126com
  • 浏览: 1871185 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP session的详细分析

    博客分类:
  • PHP
 
阅读更多

 

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
 ③php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项
 当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的:“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”;
 明白了以上的道理,我们就可以得出解决session跨页传递问题的三条途径:
 1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。
 (有人说:但在测试的时候,修改php.ini哪种方式在页面中用header('location: xx.php') 和javascript window.location=xx.php 情况下没有达到想要的效果。目前发现在<a href='xx.php'>xx</a>中正常。)
 2、手动通过URL传值、隐藏表单传递session id。
 3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。
 下面举例说明:
 第一种情况:
 page1.php
 <?php
 session_start();
 $_SESSION['var1']="中华人民共和国";
 $url="<a href="."\"s2.php\">下一页</a>";
 echo $url;
 ?>
 page2.php
 <?php
 session_start();
 echo "传递的session变量var1的值为:".$_SESSION['var1'];
 ?>
 运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
 现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”
 第二种途径:
 s1.php
 <?php
 session_start();
 $_SESSION['var1']="中华人民共和国";
 $sn = session_id();
 //PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url='<a href="page2.php?' . SID . '">下一页</a>';
 $url="<a href="."\"s2.php?s=".$sn."\">下一页</a>";
 echo $url;
 ?>
 
 
s2.php
 <?php
 session_id($_GET['s']);
 session_start();
 echo "传递的session变量var1的值为:www.2cto.com".$_SESSION['var1'];
 ?>
 
第三种途径:
 login.html
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
 <title>Login</title>
 <meta http-equiv="Content-Type" content="text/html; charset=??????">
 </head>
 <body>
 请登录:
 <form name="login" method="post" action="mylogin1.php">
 用户名:<input type="text" name="name"><br>
 口 令:<input type="password" name="pass"><br>
 <input type="submit" value="登录">
 </form>
 </body>
 </html>
 
mylogin1.php
 <?php
 $name=$_POST['name'];
 $pass=$_POST['pass'];
 if(!$name || !$pass) {
 echo "用户名或密码为空,请<a href=\"login.html\">重新登录</a>";
 die();
 }
 if (!($name=="laogong" && $pass=="123")) {
 echo "用户名或密码不正确,请<a href=\"login.html\">重新登录</a>";
 die();
 }
 //注册用户
 ob_start();                             // Turn on output buffering
 session_start();
 $_SESSION['user']= $name;
 $psid=session_id();
 $fp=fopen("e:\\tmp\\phpsid.txt","w+");
 fwrite($fp,$psid);
 fclose($fp);
 //身份验证成功,进行相关操作
 echo "已登录<br>";
 echo "<a href=\"mylogin2.php\">下一页</a>";
 ?>
 mylogin2.php
 
<?php
 $fp=fopen("e:\\tmp\\phpsid.txt","r");
 $sid=fread($fp,1024);
 fclose($fp);
 session_id($sid);
 session_start();
 if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) {
    echo "已登录!";
 }
 else {
 //成功登录进行相关操作
 echo "未登录,无权访问";
 echo "请<a href=\"login.html\">登录</a>后浏览";
 die();
 }
 ?>
 4.关于多服务器共享同一session的解决办法
    稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享SESSION 数据的问题。
 想要共享SESSION 数据,那就必须实现两个目标:一个是各个服务器对同一个客户端产生的SESSION ID 必须相同,并且可通过同一个COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为PHPSESSID 的COOKIE;另一个是SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。简单地说就是多服务器共享客户端的SESSION ID,同时还必须共享服务器端的SESSION 数据。
 第一个目标的实现其实很简单,只需要对COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的COOKIE 是不能相互访问的,如www.2cto.com 的服务器是不能读写www.bbb.com 服务器设置的COOKIE 的。这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:aaa.infor96.com 和www.infor96.com 都属于域.infor96.com,那么我们就可以设置COOKIE 的域为.infor96.com,这样aaa.infor96.com、www.infor96.com 等等都可以访问此COOKIE。PHP 代码中的设置方法如下:
 CODE:
 ini_set('session.cookie_domain', '.infor96.com');

 第二个目标的实现可以使用文件共享方式,如NFS 方式,但设置、操作上有些复杂。我们可以参考先前所说的统一用户系统的方式,即使用数据库来保存SESSION 数据,这样各个服务器就可以方便地访问同一个数据源,获取相同的SESSION 数据了。

 关于如何将session放入数据库可以见《php 程序设计》,和以下网页
http://www.eb163.com/article.php?id=75&PHPSESSID=d226cc07cec0580ec7dad47119ee4667

分享到:
评论

相关推荐

    php session阻塞页面分析及优化

    #### 一、PHP Session阻塞现象解析 在进行PHP Web开发过程中,经常会遇到由于长时间运行的脚本导致其他请求被阻塞的情况,这通常被称为“Session阻塞”。具体表现为:当一个用户正在访问某个使用了`session_start()...

    PHP中session全面教程

    在PHP中,Session的实现相对简单且高效,下面我们将详细介绍如何在PHP中使用Session。 **2.1 启动Session** 在使用Session之前,需要先启动Session。这通常是在脚本的最开始完成的,以便在整个脚本中都可以访问到...

    php写的session购物车

    通过分析这些代码,初学者可以更直观地了解如何将session应用于实际项目。 总之,PHP session购物车是一个基础但关键的应用,它展示了如何在无状态的HTTP环境中维持用户状态。理解并熟练掌握这一技术对于任何PHP...

    php_session_decoder, 在Go中,编写了PHP会话编码器/解码器.zip

    php_session_decoder, 在Go中,编写了PHP会话编码器/解码器 php_session_decoderPHP会话编解码器/解码器 安装安装:安装推荐的方法是使用 gonuts.io:nut获取 yvasiyarov/php_session_decoder详细信息,请转到 http:/

    php实现京东式session购物车简化原始优化版~

    下面将详细解释如何使用PHP实现京东式的session购物车,并结合数据库进行优化。 首先,我们来理解`session`的概念。在PHP中,session是一种在服务器端存储用户状态的方法。当用户访问网站时,服务器会为每个用户...

    phpcms web发布session过期问题解决

    `TestFX168Parser.java`、`FX168Parser.java`、`ParserUtil.java`、`ParserLinks.java`可能涉及到数据解析,它们可能与phpcms的数据获取和处理有关,但直接解决session过期问题的可能性较小。 总的来说,解决phpcms...

    PHPsession和cookie讲解笔记

    - 跟踪用户行为:分析用户在网站上的活动。 - **Cookie的基本使用方法** - 创建Cookie:在PHP中,可以使用`setcookie()`函数创建一个新的Cookie。 - 读取Cookie:使用`$_COOKIE`全局数组访问已设置的Cookie。 -...

    session同服务器不同域名共享

    通过上述分析可以看出,实现跨域名的Session共享不仅需要考虑Cookie的正确配置,还需要通过自定义的Session处理函数确保数据的一致性和安全性。此外,还需要注意不同域名间的权限和安全问题,确保不会出现跨站请求...

    (转)讲解各种session

    4. 服务器接收到请求,解析出Session ID,从Session存储中查找相应数据,完成用户身份识别。 **Session的存储方式**: - 内存存储:最常见的方法,将Session数据存储在服务器内存中,如Java中的HttpSession。这种...

    session 购物车

    下面将详细讲解session购物车的工作原理、实现方式以及相关知识点。 一、session概念 1. session是一种服务器端存储用户状态的技术,它为每个用户创建一个唯一的会话ID(session ID),并将其存储在客户端(通常是...

    PHP程序设计-3期(KC016) 3.12.3销毁session常见问题.docx

    以下是针对"PHP程序设计-3期(KC016)3.12.3销毁session常见问题"的详细解析。 **问题 1:未清空SESSION变量就调用session_destroy()** 在PHP中,`session_destroy()`函数是用来彻底销毁当前会话的,包括所有与该...

    PHP session_start()问题解疑(详细介绍)

    本文将详细解析PHP `session_start()` 函数的一些常见问题及其解决方案。 1. **错误提示:Cannot send session cookie – headers already sent** 当你尝试使用 `session_start()` 时收到此警告,意味着在调用该...

    解析PHP的session过期设置

    在PHP编程中,Session是用于跟踪用户状态的一种机制,特别是在不支持Cookie或者用户禁用了Cookie的情况下。本文将深入探讨PHP的Session过期设置,帮助开发者更好地理解和控制Session的生命周期。 首先,我们需要...

    解析php中session的实现原理以及大网站应用应注意的问题

    在PHP中,Session是用于跟踪用户会话状态的关键机制,特别是在HTTP这种无状态协议中。它的实现原理基于服务器端的数据存储和客户端的唯一标识。Session的主要功能是存储和检索用户在多个网页交互过程中的信息,确保...

    基于MD5和Session的PHP安全防范.pdf

    摘要:本文讨论了基于MD5和Session的PHP安全防范,通过对Session欺骗和攻击的手段分析,结合MD5函数,提出了一个较为有效、实用的防范措施。 MD5算法在计算机安全防范中起着重要的作用,使用MD5算法已成为较常用的...

    Session Timeout需求解決

    在描述中提到的博文链接可能详细介绍了如何分析和处理Session Timeout的问题。由于链接无法直接访问,我们只能基于常规的处理方式来探讨这个问题。 首先,理解Session Timeout的设定。在Web应用的配置文件(例如...

    Laravel开发-laravel-mongodb-session

    在本文中,我们将深入探讨如何在Laravel框架中使用MongoDB作为会话存储,这是针对“Laravel开发-laravel-mongodb-session”主题的详细解析。Laravel是一个流行的PHP框架,以其优雅的语法和强大的功能而受到开发者的...

    PHP Session变量不能传送到下一页的解决方法

    在PHP编程中,Session是一种非常重要的机制,用于在多个页面之间保持用户状态。然而,有时候可能会遇到PHP Session变量无法在不同页面间传递的问题。本文将深入解析这个问题的原因,并提供解决方案。 首先,我们要...

    将PHP的session数据存储到数据库中的代码实例_.docx

    通过这种方式,我们可以确保 session 数据的安全存储,并且可以根据需要在不同网站间共享 session 数据,同时方便进行日志分析和审计。这种方法对于多用户、高并发的 Web 应用尤其有用,因为它提供了一种更可靠的...

Global site tag (gtag.js) - Google Analytics