PHP学习 Session 学习

在默认情况下session文件将被保存在c:/windows/temp

 

u     思考的问题?

用户无需登陆,就可以访问到我们的管理页面,并且可以对用户进行curd操作.

解决之道->session

 

 

u     Session的初步介绍

 

①    Session是服务器端技术

②    注意:一个会话对应一个Session文件

③    原理示意图:


①    session的基本用法(crud)增删改查.

 

1.1    如何保存session 数据

 

代码 :

 

<?php

 

       echo "<br/>***演示如何保持session数据**<br/>";

       //1.初始化session

       session_start();

       //2.保存数据

       $_SESSION['name']="shunping";

       //session文件中可以保存dobule, integer, bool, array, object

       //保存interbool

       $_SESSION['age']=100;

       $_SESSION['isBoy']=true;

 

       //保存数据

       $arr1=array("北京","小明","hello");

       $_SESSION['arr1']=$arr1;

 

       //保存一个对象到session文件

       class Dog{

              private $name;

              private $age;

              private $intro;

              function__construct($name,$age,$intro){

                     $this->name=$name;

                     $this->age=$age;

                     $this->intro=$intro;

              }

       }

 

       $dog1=new Dog("大狗",5,"很好的一只狗");

       $_SESSION['dog1']=$dog1;

       echo "保存ok";

 

?>

 

对代码说明:

* 保存的数据格式:

name|s:8:"shunping";age|i:100;isBoy|b:1;arr1|a:3:{i:0;s:6:"北京";i:1;s:6:"小明";i:2;s:5:"hello";}dog1|O:3:"Dog":3:{s:9:"

name 就是 key

s: 表示数据类型

8: 数据大小

* 我们的session中可以保存的数据类型是

string,integer,double , bool array, object.

1.2    如何获取session的数据

 

代码

<?php

 

 

       echo "<br/>获取session数据<br/>";

       require_once "Dog.class.php";

       session_start();

       //获取session

       //1.把所有的session获取

       echo "<pre>";

       print_r($_SESSION);

       echo "</pre>";

 

       //2.通过key来指定获取某个值

       echo "<br/>名字是:".$_SESSION["name"];

      

       $arr1=$_SESSION['arr1'];

 

       echo "<br/>数组的数据是:";

       foreach($arr1 as $key=>$val){

              echo"<br/>--$val";

       }

       //3.取出对象

       //保存一个对象到session文件

      

 

       $xiaogou=$_SESSION['dog1'];

 

       echo "<br/>小狗的名字:".$xiaogou->getName();

?>

 

 

小结:

(1)    要使用session,都需要初始化sesssion_start();

(2)    session文件中可以放入多个  key<==>val对 , 注意 key不能重复,val可以是基本数据类型,和array,对象.

(3)    如果我们要取出对象,则需要实现申明一下类的定义信息.

 

3.3更新session数据

 

<?php

 

 

       //更新

       session_start();

 

       $_SESSION['name']="顺平";

 

       echo "更新成功!";

?>

 

3.4  删除session数据

 

<?php

 

 

       //删除sessoin信息

       //1.删除某一个key<==>val

       session_start();

       //unset($_SESSION['name']);

 

       //2.删除所有的key<==>val

       //这样就会把当前这个浏览器对应的session文件删除.

       session_destroy();

 

       echo "删除session成功!";

?>

 

思考: 如果没有手动删除session,那么系统是怎么维护.

 

 

 

u     session的细节讨论

①    session数据默认存放时间是1440秒, 这个时间可以通过php.ini文件来修改

 

session.gc_maxlifetime= 1440

时间可以自定 ,修改后,也要重新启动apache,

这个时间是指定在1440秒内,没有使用session文件,该session才会被当做垃圾,从而被回收.

②    session 文件存放的路径是可以修改php.ini 文件

session.save_path= "c:/mysession"

修改后,需要重新启动apache

 

③    在使用session的时候,应当保证 对session进行初始化,

方法1; 在需要使用session页面都写入 session_start();

2. 在php.ini 文件中,配置session.auto_start=1(不推荐)

④服务器是怎样实现,一个session文件为一次会话服务的,原理是



u     session的实际运用

购物车实际案例—给出界面,然后实现为后面讲解禁用cookie后

还能使用session的知识点.

 

要求不使用数据库,使用session完成.

 

代码:

 

MyHall.php

<?php

 

       //购物大厅

       echo"<h1>欢迎购买</h1>";

       echo"<a href='ShopProcess.php?bookid=sn001&bookname=天龙八部'>天龙八部</a><br/>";

       echo"<a href='ShopProcess.php?bookid=sn002&bookname=红楼梦'>红楼梦</a><br/>";

       echo"<a href='ShopProcess.php?bookid=sn003&bookname=西游记'>西游记</a><br/>";

       echo"<a href='ShopProcess.php?bookid=sn004&bookname=聊斋'>聊斋</a><br/>";

       echo"<hr/>";

       echo"<a href='ShowCart.php'>查看购买到的商品列表</a>";

 

?>

 

ShowProcess.php

<?php

 

       //接收用户购买请求,并把书保存到session中.

      

       $bookid=$_GET['bookid'];

       $bookname=$_GET['bookname'];

 

       //保存到session中

       session_start();

       $_SESSION[$bookid]=$bookname;

 

       echo"<br/>购买商品成功!";

       echo"<br/><a href='MyHall.php'>返回购物大厅继续购买</a>";

 

?>

 

ShowCart.php

 

<?php

 

       echo"<h1>购物车商品有</h1>";

 

       session_start();

 

       foreach($_SESSIONas $key=>$val){

      

              echo"<br/> 书号--$key 书名--$val";

       }

 

?>

 

 

再请思考一个问题?:

如果用户禁用cookie?

 

 

当用户禁用cookie后,服务器每次 session_start() 都会 创建一个全新的seesion文件,后果就是无法让多个页面php,去共享同一份session文件.

 

如何解决问题? 从cookie sessoin 和http协议入手解决

 

 

请问? 如果客户端禁用cookie,怎样实现session技术共享多个页面?

答:

(1)在每个超链接上添加一个PHPSESSID=sesssionId;

同时在每个页面加入:

if(isset($_GET[‘PHPSESSID’]){

       //设置sesssion_id

       session_id($_GET[‘PHPSESSID’]);

}

session_start();...

(2)使用常量SID

   使用方法如下:

在超链接 action header(“Location: xx”) 可以直接拼接 SID常量即可

echo "<ahref='ShopProcess.php?bookid=sn003&bookname=西游记&".SID."'>西游记</a><br/>";

 

(3) 可以启用session.use_trans_sid 指定是否启用透明 SID 支持 即可以这样设置

 

ssssion. use_trans_sid = 1 ,这样重启apache即可生效.

 

具体处理代码:

MyHall.php

 

<?php

 

       if(isset($_GET['PHPSESSID'])){

              session_id($_GET['PHPSESSID']);

       }

 

       session_start();

      

 

       //echo "sid====".SID;

 

       //购物大厅

       echo "<h1>欢迎购买</h1>";

       echo "<ahref='ShopProcess.php?bookid=sn001&bookname=天龙八部&".SID."'>天龙八部</a><br/>";

       echo "<a href='ShopProcess.php?bookid=sn002&bookname=红楼梦&".SID."'>红楼梦</a><br/>";

       echo "<ahref='ShopProcess.php?bookid=sn003&bookname=西游记&".SID."'>西游记</a><br/>";

       echo "<ahref='ShopProcess.php?bookid=sn004&bookname=聊斋&".SID."'>聊斋</a><br/>";

       echo "<hr/>";

       echo "<a href='ShowCart.php?".SID."'>查看购买到的商品列表</a>";

 

?>

 

ShopProcess.php

<?php

 

       //接收用户购买请求,并把书保存到session中.

      

       //保存到session中

       if(isset($_GET['PHPSESSID'])){

              session_id($_GET['PHPSESSID']);

       }

      

       session_start();

      

 

       $bookid=$_GET['bookid'];

       $bookname=$_GET['bookname'];

 

       $_SESSION[$bookid]=$bookname;

 

       echo "<br/>购买商品成功!";

       echo "<br/><ahref='MyHall.php?".SID."'>返回购物大厅继续购买</a>";

 

?>

 

ShowCart.php

<?php

 

       echo "<h1>购物车商品有</h1>";

 

       //这里不能让服务器创建一个新的session

 

       if(isset($_GET['PHPSESSID'])){

              session_id($_GET['PHPSESSID']);

       }

       session_start();

 

       foreach($_SESSION as $key=>$val){

      

              echo "<br/> 书号--$key 书名--$val";

       }

 

?>

 

 

u     再看一个session的实际运用案例

如何防止用户非法登录.


 

思路如图:



代码

loginProcess.php  增加:

if($name!=""){

     //把登陆信息写入cookie 'loginname':$name

     //把登陆表把登陆的人ip id..

     //合法

     session_start();

     $_SESSION['loginuser']=$name;

     header("Location:empManage.php?name=$name");

     exit();

   }

在编写commmon.php文件中添加了一个函数

//把验证用户是否合法封装函数

   function checkUserValidate(){

     session_start();

     //先写在封

     if(empty($_SESSION['loginuser'])){

        header("Location:login.php?errno=1");

     }

   }

在需要防止用户非法登录页面中引入这样两句(这两句话,放在页面的开头)

require_once 'common.php';

       checkUserValidate();

 

u     session技术的实际运用



验证码


为什么我们需要验证码

1.      防止登录时,恶意攻击

2.      防止灌水.

.......

验证码实现思路图分析:





代码: 直接在我们雇员管理系统中增加验证码功能:

 

1.      checkCode.php 这个文件引入到你的项目中

2.      在login.php页面中添加一个<img/>标签 ,向checkCode.php发送请求

 

<imgsrc="checkCode.php"onclick="this.src='checkCode.php?aa='+Math.random()"/>

3.      在loginProcess.php 页面中,添加对验证码的处理

代码

//先看看验证码是否 ok

       session_start();

       if($checkCode!=$_SESSION['myCheckCode']){

              header("Location:login.php?errno=2");

              exit();

       }


=======================================================




u     php.ini文件中关于cookie和session的设置

 

①    session.name

该配置用于设置session的名字,这个值可以通过 session_name() 来获取.

②    session.use_trans_sid 默认是0,

session.use_trans_sid= 0

说明:给每个url启用 session名=sessionId,对安全有影响,不推荐开启

③    sessoin.save_path = 路径

可以配置把网站的session文件放在哪个目录下.

 

④    三个一组:

session.gc_maxlifetime= 1440

说明:session默认最大生命周期

session.gc_probability= 1

session.gc_divisor= 1000

 

说明: 上面三个配置,共同来决定,session的垃圾回收清除.

 

原理图 机制





说明: 当某个用户操作session的时候,会使用到session_start(), 该函数会调用gc ,但是其概率是  session.gc_probability/ session.gc_divisor

原因是: 对于一个网站说,有很多用户访问,因此当大量用户访问的时候,概率很多.如果网站的规模越大,我们建议把这个概率设置越小.

 

演示

session.gc_maxlifetime= 30

说明:session默认最大生命周期

session.gc_probability= 1000

session.gc_divisor= 1000

 

⑤ session.cookie_lifetime= 0

 

该设置可以指定cookie默认生命周期,默认是0,表示当关闭浏览器后,该cookies失效,你可以这样

setcookie(“名字”,”val”,time()+3600);

setcookie(“名字”,”val”);

 

 

u     自定义会话处理器

 

说: session 的各种操作,都可以同自定义会话处理来自己决定, 靠

session_set_save_handler

如果你要自定义处理session,需要在php.ini文件中做一个设置.

session.save_handler= [files\user]

 

需求: 为什么session文件打头是sess_* ,我们能

不能自己定义session文件名? hsp_*

 

代码如下:

<?php

 

 

       function open($save_path, $session_name)

{

  global $sess_save_path;

 

  $sess_save_path = $save_path;

  return(true);

}

 

function close()

{

  return(true);

}

 

function read($id)

{

  global $sess_save_path;

 

  $sess_file ="$sess_save_path/hsp_$id";

  return (string)@file_get_contents($sess_file);

}

 

functionwrite($id, $sess_data)

{

  //echo "id=$id ********************数据 $sess_data<br/>";

  global $sess_save_path;

 

  $sess_file = "$sess_save_path/hsp_$id";

  if ($fp = @fopen($sess_file, "w")){

    $return = fwrite($fp, $sess_data);

    fclose($fp);

    return $return;

  } else {

    return(false);

  }

 

}

 

//session_destory()

functiondestroy($id)

{

  global $sess_save_path;

 

  $sess_file ="$sess_save_path/hsp_$id";

  return(@unlink($sess_file));

}

 

functiongc($maxlifetime)

{

  global $sess_save_path;

 

  foreach(glob("$sess_save_path/hsp_*") as $filename) {

    if (filemtime($filename) + $maxlifetime< time()) {

      @unlink($filename);

    }

  }

  return true;

}

 

//session_set_save_handler有六个回调函数.

session_set_save_handler("open","close", "read", "write", "destroy","gc");

 

session_start();

 

 

$_SESSION['aa']="helloworld";

 

?>

 

通过该案例: 我们充分体会 session的操作流程,是可以修改...

session数据可以存放的位置

(1)    文件

(2)    数据库

(3)    内存(memcache)

(4)    网络文件nfs



posted @ 2012-11-29 20:35  sfshine  阅读(272)  评论(0编辑  收藏  举报