session和cookie相似,都用来存储使用者的资料。最大不同是session存储在服务器端,cookie存储在浏览器端
当某个用户向web服务器发送请求时,服务器首先检查这个客户端的请求里是否已经包含了一个Session ID 如果包含,说明之前已经为此用户创建过Session,服务器则按该Session ID把Session检索出来使用。如果客户端请求不包含Session ID,则为该用户创建一个Session,并且生成一个与此Session关联的Session ID,本次相应被传送到客户端保存。
Session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能。(每调用一次session_start()函数,服务器中的sess_开头的文件便新创建一个)
Session自动回收机制:
直接关闭浏览器后,服务器端保存的Session文件是不会被删除的,但下次打开浏览器登陆原网页时,会重新分配Session ID
用session.cookie_lifetime=0,设置Session ID在浏览器Cookie中的有效期。0表示知道浏览器关闭,Session ID才会消失。
用session.gc_maxlifetime选项来指定一个时间,当网页刷新或加载后,会更改session文件的时间,“垃圾回收程序”启动后会在所有session文件中排查,删除修改时间距离当前系统时间大于session.gc_maxlifetime设置值的session文件(只是将文件设置为空,并不删除文件)。
Session ID的传递:
1、cookie方式传递
例:
1 <?php 2 session_start(); 3 function clearcookie() 4 { 5 foreach($_COOKIE as $key=>$val) 6 setcookie($key,'',time()-1); 7 } 8 9 function clearsession() 10 { 11 $_SESSION=array(); 12 setcookie(session_name(),'',time()-1); 13 session_destroy(); 14 } 15 16 if($_GET["action"]=="setsess") 17 { 18 $key=$_POST['session_name']; 19 $value=$_POST['session_value']; 20 $_SESSION["{$key}"]="{$value}"; 21 }else if($_GET["action"]=="discook"){ 22 print_r($_COOKIE); 23 }else if($_GET["action"]=="dissess"){ 24 print_r($_SESSION); 25 }else if($_GET["action"]=="deletecook"){ 26 clearcookie(); 27 }else if($_GET["action"]=="deletesess"){ 28 clearsession(); 29 } 30 ?> 31 <html> 32 33 <form action="session.php?action=setsess" 34 35 method="post"> 36 <input type="text" name="session_name"/> 37 <input type="text" name="session_value"/><br> 38 <input type="submit" value="setSession"/> 39 </form> 40 41 <br> 42 <br> 43 <br> 44 45 <form action="session.php?action=discook" 46 47 method="post"> 48 <input type="submit" value="disCookie"/> 49 </form> 50 51 <br> 52 <br> 53 <br> 54 55 <form action="session.php?action=dissess" 56 57 method="post"> 58 <input type="submit" value="disSession"/> 59 </form> 60 <br> 61 <br> 62 <br> 63 64 <form action="session.php?action=deletecook" 65 66 method="post"> 67 <input type="submit" value="deleteCookie"/> 68 </form> 69 <br> 70 <br> 71 <br> 72 73 <form action="session.php?action=deletesess" 74 75 method="post"> 76 <input type="submit" value="deleteSession"/> 77 </form> 78 </html>
2、浏览器禁用cookie后,可用URL方式传递
例:
1 <?php 2 $sid=!empty($_GET[session_name()])?$_GET[session_name()]:''; 3 session_id($sid); 4 session_start(); 5 ?> 6 7 <html> 8 <a href="urlsess2.php?<?php echo session_name().'='.session_id()?>">page2</a> 9 <a href="urlsess3.php?<?php echo session_name().'='.session_id()?>">page3</a> 10 </html>
1 <?php 2 $sid=!empty($_GET[session_name()])?$_GET[session_name()]:''; 3 session_id($sid); 4 session_start(); 5 echo session_name().'='.session_id(); 6 ?>
1 <?php 2 $sid=!empty($_GET[session_name()])?$_GET[session_name()]:''; 3 session_id($sid); 4 session_start(); 5 echo session_name().'='.session_id(); 6 ?>