1,思考:登陆网站后,在每一个网页都能拿到用户信息php
(1) 使用超连接传递用户名,这样太繁琐了,不建议使用 。web
(2) 使用数据库,每打开一个页面都查询一次用户信息表,这样网页加载速度变慢,用户体验变差。数据库
(3) 使用cookie,登陆成功后,服务器将用户信息存储到客户端的cookie。这样存在缺点:数组
① 安全性差,将用户信息存储在本地,很容易被别人找到。 浏览器
② 服务器每次打开一个网页,都经过网络从客户机读取用户信息,这样浪费带宽,当用户不少,每一个用户打开不少网页,会浪费巨大的带宽。安全
(4) 解决之道:session服务器
2,session技术cookie
Session是服务器端技术,利用这个技术,服务器能够为每一个用户的浏览器建立一个为其独享的session文件,因为session为用户浏览器独享,因此用户在访问服务器的web资源时,能够把各自的数据放在各自的session中,当用户再去访问服务器中的其余web资源时,其余web资源再从用户各自的session中取出数据为用户服务。 网络
3,保存session信息session
index1.php
<?php session_start(); // 初始化session $_SESSION['name'] = "zhangsan"; //保存某个session信息
index2.php
<?php session_start(); echo $_SESSION['name'];
先在网页中运行index1.php,再运行index2.php页面输出:
4,session能够保存多种数据类型
session不但保存字符串,还能够保存整型,布尔型,数组,对象等。
index1.php
<?php session_start(); // 初始化session $_SESSION['name'] = "zhangsan"; //保存某个session信息 $_SESSION['age'] = 100; $_SESSION['isBoy'] = true; $arr1 = array("北京","小明","hello"); $_SESSION['arr1'] = $arr1; 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("大黄",2,"很听话"); $_SESSION['dog1'] = $dog1;
index2.php
<?php session_start(); foreach($_SESSION as $key=>$value){ echo $key.":"; var_dump($value); echo "<br/>"; }
先在网页中运行index1.php,再运行index2.php页面输出:
5,获取session信息
(1)直接获取全部session
(2)根据key获取
a)直接获取某个变量
b)获取数组
c)获取对象,session在保存对象时候,无法保存类的信息,所以在获取对象,须要先声明这个类。能够把类单独做为一个文件,存储和读取session时候分别引用这个文件。
6,Session的更新,就是根据key值从新保存session的值。
7, Session的删除
(1) 指定删除session中某个键值对
(2) 删除全部session
8,Session数据默认存在时间是1440s(24分钟),能够在php.ini中修改, session.gc_maxlifetime = 1440。Session文件的存放路径是能够修改的,能够经过修改php.ini改变sesion文件存放路径,session.save_path = "tcp://127.0.0.1:11211"。
9,Session使用前,先进行初始化,session_start();这样比较麻烦,能够在php.ini设置session自动初始化,session.auto_start = 0(此方法不推荐)。
10,浏览器访问页面a.php时候,服务器产生一个session文件,将其存放在服务器,同时将session_id发送给浏览器,浏览器将其保存到cookie,浏览器再次访问b.php时候,从cookie中获取session_id发送到服务器,服务器根据session_id获取相应session内容。
问题:若是浏览器禁用cookie,怎么使用session呢?
使用URL重写的方式,url重写分为手动和自动。自动重写url就是配置php.ini,开启透明的SID,其余程序不变,自动重写url不安全,不建议使用。
开启透明SID,须要修改的php.ini是:
session.use_trans_sid = 1 //由0改成1
session.use_only_cookies = 0 //是否只使用cookie来保存session值 该参数为1时,上述机制失效。
session.use_cookies = 0 //设置客户端是否使用cookie来保存session值 该参数的值不影响上述机制的进行。这个可改可不改
手动模式:
index1.php
<?php session_start(); $_SESSION['name'] = "zhangsan"; $_SESSION['age'] = 100; echo 'session save succes! click <a href="index2.php?'.SID.'">here</a> to see SID<br/>';
index2.php
<?php if($_GET["PHPSESSID"]){ session_id($_GET["PHPSESSID"]); } session_start(); echo session_id().'<br/>'; echo $_SESSION['name'];
而自动模式,会将url后面自动添加PHPSESSID参数,因此在index1.php中去掉SID便可,index2.php不变。
index1.php
<?php session_start(); $_SESSION['name'] = "zhangsan"; $_SESSION['age'] = 100; echo 'session save succes! click <a href="index2.php">here</a> to see SID<br/>';
11,php.ini中关于session和cookie的配置
(1) session.use_trans_sid = 0,开启后,默认为每一个url后添加了session_name=session_id。
(2) session.save_path=”c:/mysession”,save_path是session文件在服务器的存放路径。
(3) session.gc_maxlifetime = 1440,session默认最大生命周期,当session文件在1440s后没被访问的话,则该session被视为“垃圾文件”,而且等待gc(垃圾回收)进程的调用时候被清理掉;session.gc_probability=1;session.gc_divisor=1000;这两个参数根据网站规模合理设置。每当初始化一个session时候,有gc_probability/gc_divisor的几率执行一次垃圾回收。
我开启三个会话,则建立三个对应的session文件,当每一个文件在30秒内都没被调用的话,就会被当成是“垃圾文件”,等到gc进程调用的时候,“垃圾文件”就会被unlink,由于以前我已经经过修改php.ini配置文件,将gc被调用的几率改为百分百,因此接下来,若是我从新使用任何一个浏览器刷新下页面的时候,三个session文件,应该只剩下一个了。
(4) session.cookie_lifetime,以秒数指定了发送到浏览器的cookie的生命周期,值为0表示“直到关闭浏览器”。默认为0。这个与程序中setCookie(“name”,”zhangsan”,time()+60);相似。