陈力:传智播客古代 珍宝币 泡泡龙游戏开发第45讲:PHP程序设计中的session技术
Session是服务器端技术,可以把各自的数据放在各自的session中。通过session_start();进行初始化后,如果创建、修改和删除session,如果理解服务器实现一个session为一个用户浏览器会话服务的。本文结合笔者多年贵阳网站建设实践经验进行分析。
大家都在淘宝网上购买过商品,张三和李四他们购买的商品不一样,他们的购物车中的显示的商品也不一样,这是怎么实现的?
另外一个问题,不同的用户登录网站后,不管该用户浏览该网站的哪个页面,都可显示登录人的名字,同样可以随时去查看自己的购物车中的商品。
这些都是通过session技术实现的。
一、session技术介绍
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
当用户打开浏览器,访问某个网站操作session时(执行session_start()),服务器就会在服务器的磁盘为该浏览器分配一个保存session信息的文件,该文件被这个浏览器独自访问。这个session也可看做是一个数组,session数据默认存在时间为1440s(即24min),从~\php.ini 的[session]节可以配置。
二、session作用1:网上商城中的购物车。
2:保存登录用户的信息。
3:将某些数据放入到Session中,供同一用户的各个页面使用。
4:防止用户非法登录到某个页面。
三、Session基本用法:
1:初始化session。
session_start();
2:向session添加数据。
$_SESSION[‘key值’]=$val;
3:从session得到某个数据值。
$val=$_SESSION[‘key值’];
4:删除session关联的数据。
session_start();//初始化session
session_destory();//销毁和当前session关联的所有数据。
session_start() 函数前不能有任何输出,包括空行和空格。
也可以通过php.ini 的 session.auto_start = 0 改成 0->1 来自动启用,这样就不需要在每个页面使用的,但是我们不推荐这样做,因为这样不能在session中保存对象了!
$_SESSION[‘session名’]=$val ; $val 类型可以是基本数据类型,也可是array,或者对象。
session的值可以是对象。[ie测试不能在新的ie去访问上一个ie的session。需要向关闭前一个ie,否则测试不能成功]。除了生命周期这一项]
session中放置对象演示实例:
****Dog.php******
<?php
class Dog{
private $name;
private $color;
private $age;
public function set_name($name){
$this->name=$name;
}
public function set_color($color){
$this->color=$color;
}
public function set_age($age){
$this->age=$age;
}
public function get_name(){
return $this->name;
}
public function get_color(){
return $this->color;
}
public function get_age($age){
return $this->age;
}
}
?>
****session1.php 创建session()****
<?php
include_once('Dog.php');
session_start();
$_SESSION['bookname']="天龙八部";
$_SESSION['writer']='金庸';
$dog1=new Dog();
$dog1->set_name('小黄');
$dog1->set_color('红色');
$_SESSION['mydog']=$dog1;
echo '创建session成功';
?>
****session2.php(获取session)****
<?php
include_once('Dog.php');
//取出session
session_start();
$val=$_SESSION['bookname'];
(1) $dog1=$_SESSION['mydog']; //session中的数据是取出对象,要申明一个和原类型一样的结构(类的定义信息)。否则会出错。
echo 'val='.$val." name=".$dog1->get_name()." sessioni=".session_id();
?>
***session3.php(删除session值所有的数据)*****
<?php
//销毁session中的数据
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
unset($_SESSION[‘key值’]); //指定删除session某一个数据
///销毁全部session,步骤比较多(这个步骤还可在确认一下)。
//1. 清空session的值
$_SESSION=array();
//2. 删除cookie中保存的sessionid
if(isset($_COOKIE[session_name()])){
setCookie(session_name(),’’,time()-200);
}
session_destory();//销毁session
?>
另一个删除session实例:
<?php
//删除sessoin信息
//1.删除某一个key<==>val
session_start();
//unset($_SESSION['name']);
//2.删除所有的 key<==>val
//这样就会把当前这个浏览器对应的session文件删除。
session_destroy();
echo "删除session成功!";
?>
Session文件的数据格式:
name|s:8:"shun";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.
在WEB开发中,服务器可以为每个用户浏览器创建一个超全局变量$_SESSION ,注意:一个浏览器独占一个$_SESSION(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的$_SESSION中,当用户使用浏览器访问其它php页面时,其它php页面可以从用户的$_SESSION中取出该用户的数据,为用户服务。
四、Session和Cookie的主要区别:
Cookie是把用户的数据写给用户的浏览器。Session技术把用户的数据写到用户独占的$_SESSION中,存在服务器的某个路径的文件中。
在使用$_SESSION 前要保证session被初始化,具体的方法有:
①先调用session_start();
②配置php.ini session.auto_start =1 (不推荐,会影响效率)。
疑问:服务器是如何实现一个session为一个用户浏览器服务的?
图解:当浏览器A访问PHP1时,服务器执行session_start()时在相应的目录中创建一个session文件(比如文件ID号为11),同时回应浏览器A一个cookie:PHPsession=11的信息,这样浏览器A就知道以后访问服务器时需要这个session的文件了。同时,浏览器A要访问PHP2,在PHP2中也要访问session,按流程也应该先创建一个session文件,但在浏览器A发出访问session请示时,同时把cookie:PHPsession=11这个值也发向服务器,服务器知道已经创建了session无需要再创建,同时在cookie:PHPsession=11指定的文件中取值。
在前面的案例基础上,做一个测试其它IE可以取到这个php存的数据吗,并解释原因。
要实现跨浏览器访问session,这里我们只要对session1.php文件稍作修改即(http协议)[测试要成功,主要满足: 1. 先清空 cookie 2. 再用第二个浏览器浏览时,要注意先关闭前一个浏览器,否则第二个浏览器会把第一个浏览器内存的phpsessionid带给服务器,这样第二个浏览器就能访问到第一个浏览器创建的session(在不做特殊情况下就可以成功的!) 主要是看看httpwatch的http包(如果怕出问题,可以一边分析http包,一边推测现象..).]
<?php
include_once('Dog.php');
session_start();
$_SESSION['bookname']="天龙八部";
$_SESSION['writer']='金庸';
$dog1=new Dog();
$dog1->set_name('youyou1');
$dog1->set_color('红色');
$_SESSION['mydog']=$dog1;
//利用cookie把当前session id保存到cookie名字(这句话很管用)
setcookie('PHPSESSID',session_id(),time()+3600);
echo '创建session成功2!';
?>
//3.取出对象
//保存一个对象到session文件
if(!empty($_SESSION['dog1'])){
$xiaogou=$_SESSION['dog1'];
echo "<br/>小狗的名字:".$xiaogou->getName();
}else{
echo "对象没有";
}
【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第45讲:PHP程序设计中的session技术