PHP-会话管理和控制
(。・∀・)ノ
 
 
 
 
一. 前言
标准的http协议是无状态的,无连接的。
???什么意思?⊙﹏⊙∥
【无状态】
- 协议对于事务处理没有记忆能力【事物处理】【记忆能力】
- 对同一个url请求没有上下文关系【上下文关系】
- 每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况【无直接联系】【受直接影响】
- 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器【状态】
【无连接】
- 每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的
- 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接
 
具体内容以及为什么使用Session和Cookie参考下面博文:
[http协议无状态中的 “状态” 到底指的是什么?!]
 
 
二. Cookie概述
什么是Cookie?
请参考本站博客[HTTP协议请求头部的User-Agen和Cookie]
 
 
三. PHP中的Cookie
这节我们通过一个用户首次登陆网站后,再次访问不需要重复输入用户名和密码的例子来学习Cookie。
php中提供了一个函数来让我们设置cookie,这个函数是:bool setcookie();
[PHP setcookie() 函数]
需要注意的是,这个函数每次只能设置Cookie中的一个参数,比如一次只能设置用户名、密码等字段。
1 | bool setcookie ( |
参数 | 描述 |
---|---|
$名字 | 必需。规定 cookie 的名称。 |
$值 | 可选。规定 cookie 的值。 |
$有效期 | 可选。规定 cookie 的有效期。 |
$路径 | 可选。规定 cookie 的服务器路径。 |
$域名 | 可选。规定 cookie 的域名。 |
$安全 | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。 |
$http只读 | 可选。如果true,那么js就无法读取改cookie,增加安全性。 |
1.一般来说,我们其实用不到上面那么多参数,对于这个函数,我们一般这么用:setcookie(cookie名,cookie值,cookie有效期);
2.没错,就那么3个。如此一来,我们就可以在服务端通过$_COOKIE[‘name’] 来读取cookie了。
 
 
以下是示例:
- 我们将文件名命名为:cookie.php。
- 我们来模拟我们在互联网上见到最常见的例子:输入用户名和密码,登陆成功的过程。
- 我们来建一个数据库login,其中有表user,有username和password这两个字段。
1 |
|
 
跳转到的welcome.php代码
1 |
|
 
- 这样,当我第一次访问cookie.php的时候,我需要输入用户名和密码,输入完毕后跳转到了welcome.php。然后我关闭浏览器,再次打开cookie.php,这次没有要求我输入用户信息,而是直接跳转到了welcome.php,因为之前我们存的cookie信息被浏览器自动发送到了服务端,服务端做完处理直接跳转到了welcome.php,服务器认识我们了!知道我是之前那个登陆过的用户,这样我们就通过cookie技术让无状态的HTTP协议保持了状态。
照着这个做一遍,我相信你会用cookie了。- 只不过!!!只不过!!!只不过!!!重要的事要说3遍,我们一般是不会把用户名和密码放到cookie中的,因为这并不安全,容易泄露自己的信息,请不要把重要的信息放到cookie中。我们这个只是一个学习cookie的例子。
 
 
四. PHP中使用session
什么是session以及一些使用方法?可参考博文:
[php中Session使用方法详解]
[PHP会话机制—session的基本使用]
[W3school PHP Sessions]
 
- 注意:session_start()函数之前不能有任何输出,session_start() 函数必须位于
<html>
标签之前:<?php session_start(); ?>
<\html>
<body>
</body>
</html>
- 当第一次访问网站时,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中普通变量相同的命名规则。
 
4.1 开启session
使用函数:bool session_start()
[PHP setcookie(void) 函数]
首先我们要开启session,那么第一个要学习的函数就是
bool session_start()了,这个函数没有参数。在php文件的开始使用
1 | session_start(); |
 
4.2 (注册)添加session数据
开启会话之后,那么在接下来的处理中,我们就可以使用$_SESSION变量来存取信息了。我们要知道的是$_SESSION变量是个数组。当我们要把信息存入session的时候应该这么写:
1 | $_SESSION['userName'] = 'wang'; |
 
4.3 读取session数据
读取很简单,就像我们使用数组一样,如下:
1 | $userName = $_SESSION['userName']; |
当然也可以 $_SESSION[‘userName’] 来用。和数组一样的使用。
 
4.4 销毁session数据
我们可以使用很多种方式来销毁session数据。
a) unset函数
我们通过使用类似
1 | unset($_SESSION['XXX']); |
来销毁session中的 XXX 变量。
请不要!请不要!请不要unset($_SESSION),会导致后续无法使用$_SESSION这个变量!!!
 
b) 空数组赋值给session变量
1 | $\_SESSION = array(); |
之前我们说过$_SESSOIN变量是个数组,那么空数组赋值的话也是相当于将当前会话的$_SESSION变量中的值销毁。
 
c) session_destory() 函数
这个函数会销毁当前会话中的全部数据,并结束当前会话。但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。
 
4.5 session的扩展
我们可以使用很多种方式来销毁session数据。
默认session存储在哪里?
 
1.在php.ini
配置文件中有这么一行 session.save_handler = files
,
files说明了php默认的是用文件读写的方式来保存session的。那么在哪个目录呢?继续看。session.save_path = “/tmp”,这一行前面有个 ; ,说明是被注释的,不过即便这样,php默认的session 也是保存在这里的,/tmp
目录。
 
 
五. SESSION应用实例
5.1 登陆例子
2个文件:
- login.php,用于登陆界面;
- welcome.php,用于接收从login.php的跳转并设置session。
首先建立数据库信息:
新建一个名为 login 的数据库,再建一个 user 表,表的结构有2个字段:
username varchar(20)
password varchar(20)
 
login.php
1 |
|
 
 
welcome.php 这里我们用的是session中的信息,而不是像cookie一样在url中带参数过来
1 |
|
 
5.2 购物车例子
3个文件:
- goodsList.php 这个是商品展示页,还有功能:如果是第一次购买某物品,则在购物车中加入该商品信息和计算总价,如果再次点击购买,则已购商品数量加1,总价重新计算,查看购物车链接可以到购物车页面。
- buy.php 此页完成购买功能,然后再次跳转到商品列表。主要是做了在session中处理购买商品操作。
- shoppingCart.php 此页展示购物车中的商品、价格、总价等信息。
 
首先建立数据库信息:
建立名为test的数据库,库中有个shop表,表结构有3个字段:
id int(10)
name varchar(20)
price varchar(20)
 
goodsList.php
1 |
|
 
buy.php
1 | <html> |
 
shoppingCart.php
1 | <html> |
 
效果图如下: