一般来说,登录信息既可以存储在session中,也可以存储在cookie中,他们之间的差别在于session可以方便的存取多种数据类型,而cookie只支持字符串类型,同时对于一些安全性比较高的数据,cookie需要进行格式化与加密存储,而session存储在服务端则安全性较高
一、SESSION操作
1、 使用SESSION
在使用PHP session时,一定要在页头加上session_start()
,告诉服务器开始使用session了,而且在它之前应该没有任何输出,否则会报错。
# 开始一个会话或者返回已经存在的会话
session_start();
2、设置session
$_SESSION['jack']['name'] = 'jack';
$_SESSION['jack']['height'] = 175;
$_SESSION['jack']['weight'] = 160.00;
$_SESSION['jack']['like'] = ['eat','run','sing','jump'];
$_SESSION['jack']['class'] = new test();
$_SESSION['jack']['null'] = null;
$txt = file_get_contents('hello.txt');
$_SESSION['jack']['res'] = $txt;
class test{
public function abc(){
echo 'test';
}
}
echo '<pre>';
var_dump($_SESSION);
session保存在配置文件(session.save_path)指定的服务器路径中。保存的格式:变量名|类型:长度:值;
3、判断和删除
isset($_SESSION['name']); // 判断
unset($_SESSION['name']); //删除
4、销毁session
如果要清空当前用户所有的Session信息可以使用以下代码:
session_destroy(); //销毁session 结束当前会话
二、SESSION的工作原理
-
用户访问WEB网站的时候,比如请求
goods.php
; -
再运行
session_start()
时,PHP会给每个访问的用户创建一个session ID -
该ID是唯一ID,同时使用该ID命名生成文本文件,在服务器端保存会话数据,
-
同时在客户机上cookie里存储该ID,
- 下次用户请求,就会携带该ID,来获取服务器上存储的会话数据
三、SESSION的几个注意点
1、session_start()前的输出
1、使用基于cookie的session时,函数session_start()必须在程序最开始执行,在其前面不能有任何输出内容,否则:
Warning: Cannot send session cache limiter - headers already sent (output started at ...
可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。
2、session的存储方式
PHP的session默认是通过文件的形式实现的,即存储在服务器端的session文件,每个session一个文件。
文件名形式:sess_jkj7hkfje9klhgop8s0ferascdwedjksjkxj,
内容结构:`变量名 | 类型 |:长度 : 值;
3、客户端禁用Cookie功能
基于cookie的session更优化,但不总是可用。一旦用户关闭cookie,那么session就不起作用啦!所以接下来我们将要把session的id号放在链接地址上,这样就不怕用户关闭cookie啦!
PHP5在linux平台可以自动检测Cookie状态,如果客户禁用它,则系统自动把sessionId附加到URL上传送。但windows没有此功能
a. login.php
<?php
session_start();
?>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="act.php?<?php echo SID;?>" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="pass"><br/>
<input type="submit" name="send" value="login">
</form>
</body>
</html>
act.php
if( isset($_GET[session_name()]) ){
$sid = $_GET[session_name()];
session_id($sid);
}
session_start();
$_SESSION['name'] = $_POST['username'];
$_SESSION['pass'] = $_POST['pass'];
var_dump($_SESSION);
echo '<a href="logout.php?'.SID.'">退出</a>';
logout.php
if( isset($_GET[session_name()]) ){
$sid = $_GET[session_name()];
session_id($sid);
}
session_start();
$_SESSION = [];
setcookie(session_name(),'',time()-1,'/');
session_destroy();