session传递参数_php中Session使⽤⽅法详解
Session的声明与使⽤
Session的设置不同于Cookie,必须先启动,在PHP中必须调⽤session_start()。session_start()函数的语法格式如下:
Bool session_start(void)//创建Session,
开始⼀个会话,进⾏Session初始化
注意:session_start()函数之前不能有任何输出
当第⼀次访问⽹站时,Seesion_start()函数就会创建⼀个唯⼀的Session ID,并⾃动通过HTTP的响应头,将这个Session ID保存到客户端Cookie中。同时,也在服务器端创建⼀个以Session ID命名的⽂件,⽤于保存这个⽤户的会话信息。
当同⼀个⽤户再次访问这个⽹站时,也会⾃动通过HTTP的请求头将Cookie中保存的Seesion ID再携带过来,这时Session_start()函数就不会再去分配⼀个新的Session ID,⽽是在服务器的硬盘中去寻和这个Session ID同名的Session⽂件,将这之前为这个⽤户保存的会话信息读出,在当前脚本中应⽤,达到跟踪这个⽤户的⽬的。 Session以数组的形式使⽤,如:$_SESSION[‘session名‘]
注册⼀个会话变量和读取Session
在PHP中使⽤Session变量,除了要启动之外,还要经过注册的过程。注册和读取Session变量,都要通过访问$_SESSION数组完成。在$_SESSION关联数组中的键名具有和PHP中普通变量相同的命名规则。注册Session变量的代码如下所⽰:
<?php//启动session的初始化session_start();//注册session变量,赋值为⼀个⽤户的名称$_SESSION[
"username"]="skygao";//注册session变量,赋值为⼀个⽤户的ID$_SESSION["uid"]=1;?>
执⾏该脚本后,两个Session变量就会被保存在服务器端的某个⽂件中,该⽂件的位置是通过php.ini⽂件,在session.save_path属性指定的⽬录下。
注销变量与销毁Session
当使⽤完⼀个Session变量后,可以将其删除,当完成⼀个会话后,也可以将其销毁。如果⽤户退出Web系统,就需要为他提供⼀个注销的功能,把他的所有信息在服务器中销毁。销毁和当前Session有关的所有的资料,可以调⽤session_destroy()函数结束当前的会话,并清空会话中的所有资源。该函数的语法格式如下所⽰:
boolsession_destroy(void)//销毁和当前Session有关的所有资料
该函数并不会释放和当前Session相关的变量,也不会删除保存在客户端Cookie中的SessionID。因为$_SESSION数组和⾃定义的数组在使⽤上是相同的,所以我们可以使⽤unset()函数来释放在Session中注册的单个变量。如下所⽰:
unset($_SESSION[‘键名‘]);
⼀定要注意,不要使⽤unset($_SESSION)删除整个$_SESSION数组,这样将不能再通过$_SESSION超全局数组注册变量了。但如果想把某个⽤户在Session中注册的所有变量都删除,可以直接将数组变量$_SESSION赋上⼀个空数组。如下所⽰:
$_SESSION=array()
PHP默认的Session是基于Cookie的,SessionID被服务器存储在客户端的Cookie中,所以在注销Session时也需要清除Cookie中保存的SessionID,⽽这就必须借助setCookie()函数完成。在PHP脚本中,可以通过调⽤session_name()函数获取Session名称。删除保存在客户端Cookie中的SessionID,
代码如下所⽰:
<?php//判断Cookie中是否存在session IDif(isset($_COOKIE[session_name()])){//删除包含Session ID的cookie,注意第四个参数⼀定要和php.ini设置的路径相同setcookie(session_name(),‘‘,time()-3600,‘/‘); }?>
通过前⾯的介绍可以总结出,Session的注销过程共需要4个步骤。在下例中,提供完整的四个步骤代码,运⾏该脚本就可以关闭Session,并销毁与本次会话有关的所有资源。代码如下所⽰:
1<?php2//第⼀步:开启Session并初始化3session_start();45//第⼆部:删除所有Session的变量,也可
以⽤
unset($_SESSION[XXX])逐个删除6$_SESSION =array();78//第三部:如果使⽤基于Cookie的session,使⽤setCookkie()删除包含Session ID的cookie9if(isset($_COOKIE[session_name()])) {10setCookie(session_name(),"", time()-42000,"/");11}1213//第四部:最后彻底销毁session14session_destroy();1516?>
session的phpini配置选项
session如何设置和读取
php.ini⽂件和Session有关的⼏个常⽤配置选项: session.auto_start=0; 在请求启动时初始化session session.cache_expire=180; 设置缓存中的会话⽂档在 n 分钟后过时 kie_lifetime=0; 设置按秒记的cookie的保存时间,相当于设置Session的过期时间,为0时表⽰直到浏览器被重启
session.auto_start=1,这样就⽆需每次使⽤session之前都要调⽤session_start()不建议使⽤.但启⽤该选项也有⼀些限制,如果确实启⽤了 session.auto_start,则不能将对象放⼊会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。
取回数据的控制⽅式 session.save_path= /tmp ; 在 save_handler 设为⽂件时传给控制器的参数, 这是数据⽂件将保存的路径. session.use_cookies=1; 是否使⽤cookies
Session的垃圾⾃动回收机制
可以通过session_destroy()函数在页⾯中提供⼀个“退出”按钮,通过单击销毁本次会话。但如果⽤户没有单击退出按钮,⽽是直接关闭浏览器,或断⽹等情况,在服务器端保存的Session⽂件是不会删除的。
虽然关闭浏览器,下次需要重新分配⼀个新的Session ID重新登录,但这只是因为在php.ini中的设置kie_lifetime=0,来设定Session ID在客户端Cookie中的有效限期,以秒为单位指定了发送到浏览器的Cookie的⽣命周期。
当系统赋予Session有效期限后不管浏览器是否开启,Session ID都会⾃动消失。⽽客户端Session ID消失服务器端保存的Session⽂件并没有被删除。所以没有被Sessoin ID引⽤的服务器端Session⽂件,就成为了“垃圾”。
服务器保存的Session⽂件就是⼀个普通⽂本⽂件,所以都会有⽂件修改时间。“垃圾回收程序”启动后就是根据Session⽂件的修改时间,将所有过期的Session⽂件全部删除。
通过在php.ini中设置_maxlifetime选项来指定⼀个时间(单位:秒),例如设置该选项值为1440(24分钟)。“垃圾回收程序”就会在所有Session⽂件中排查,如果有修改时间距离当前系统时间⼤于1440秒的就将其删除。
“session垃圾回收程序”是怎样的启动机制呢?“垃圾回收程序”是在调⽤session_start()函数时启动的。⽽⼀个⽹站有多个脚本,没有脚本⼜都要使⽤session_start()函数开启会话,⼜会有很多个⽤户同时访问,这就很可能session_start()函数在1秒内被调⽤N次,⽽如果每次都会启动“session垃圾回收程序”,这样是很不合理的。
可以通过php.ini⽂件中修改“_probability和_divisor”两个选项,设置启动垃圾回收程序的概率。会根
据“__divisor”公⽰计算概率,例如选项_probability=1,⽽选项
<_divisor=100,这样的概率就是“1/100”,即session_start()函数被调⽤100次才会有⼀次可能启动“垃圾回收程序”。
php.ini中相关的配置
cookie禁⽤时通过URL传递session的ID
使⽤Session跟踪⼀个⽤户,是通过在各个页⾯之间传递唯⼀的Session ID,并通过Session ID提取这个⽤户在服务器中保存的Session变量。常见的Session ID传送⽅法有以下两种。
第⼀种⽅法是基于cookie的⽅式传递session ID,这种⽅式更优,但不总是可⽤, 因为⽤户在客户端可以屏蔽cokie;
第⼆种⽅法是通过url参数进⾏传递,直接将session ID嵌⼊到URL中去。
在Session的实现中通常都是采⽤Cookie的⽅式,客户端保存的Session ID就是⼀个Cookie。当客户禁⽤Cookie时,Session ID就不能在Cookie中保存,也就不能在页⾯之间传递,此时Session失效。不过PHP5在Linux平台可以⾃动检查Cookie状态,如果客户端禁⽤它,则系统⾃动把Session ID附加到URL上传送。⽽使⽤Windows系统作为Web服务器则⽆此功能。
在PHP中提出了跟踪Session的另⼀种机制,如果客户浏览器不⽀持Cookie,则PHP可以重写客户请
求的URL,把Session ID添加到URL 信息中。可以⼿动地在每个超链接的URL中都加上⼀个Session ID,但⼯作量⽐较⼤,不建议使⽤这种⽅法。如下所⽰:
<?php//开启sessionsession_start();//在每个URL后⾯附加上参数,变量名为session_name()获取名称,值通过session_id()获取echo‘<a href="demo.php?‘.session_name().‘=‘.session_id().‘">连接演⽰</a>‘;?>
在使⽤Linux系统做服务器时,则在编辑PHP时如果使⽤了–enable-trans-sid配置选项,和运⾏时选项session.use_trans_sid都被激活,在客户端禁⽤Cookie时,相对URL将被⾃动修改为包含会话ID。如果没有这么配置,或者使⽤Windows系统作为服务器时,可以使⽤常量SID。该常量在会话启动时被定义,如果客户端没有发送适当的会话Cookie,则SID的格式为session_name=session_id,否则就为⼀个空字符串。因此可以⽆条件地将其嵌⼊到URL中去。在下例中使⽤两个脚本程序,演⽰了Session ID的传送⽅法。<?php
session_start(); $_SESSION["username"]="admin"; echo"session ID:".session_id()."<br>";?>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。