总结了一下session的一些基础使用,同时添加一些实现代码,方便自己查看
开启session
session_start; //之前不能有任何输出语句 $_SESSION['username'] = 'wenqing'; //c:/windows/temp/下产生文件 session的请求中请求头信息有一个Cookie:PHPSESSIONID=xxxx;保存的session_id,这个是唯一编号,可以通过编号查找session文件 session的键名只能是字符串,否则会设置失败$_SESSION['test'] = 'test'; //新版本的php中已经支持了int类型session
session_name() //获取当前session的名称
session_id() //获取当前session的唯一id值
把session保存到cookie中
setcookie(session_name(),session_id(),time()+3600);
清空session
session_destory(); //清空所有的session setcookie(session_name(),session_id(),time()-1);
禁用cookie后session还可以使用吗?
session_only_cookies = 1 //设置是否仅能通过cookie传递sessionid,还可以通过url传递,所以禁用cookie,session还是可以使用的 session_gc_maxlifetime = 1440 //多少s后,保存数据视为垃圾自动回收
1 | <a href="dump.php?<?php echo session_name();?>=<?php echo session_id();?>">跳转输出session</a> //url传递session_id |
session_id($_GET[session_name()]); //session_id() 获取或设置会话id session_start(); var_dump($_SESSION);
session说明
当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。 但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态。
通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,
在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中, 亦或通过 URL 进行传导。
自定义session处理器
由于默认的session保存在files中,这样无论是存取速度或者占用空间都是不太合适的,所以一般使用mysql或者缓存(redis,memcache进行存储)
session.save_handler = files
下面是简单的实现以下session自定义mysql的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
ini_set("session.save_handler",'user');
function open(){
echo "<h1>call open</h1>";
$link=mysql_connect("127.0.0.1",'root','root') or die('connect error');
mysql_set_charset('utf8');
mysql_select_db('test');
return true;
}
function close(){
echo "<h1>call close.</h1>";
return true;
}
function read($session_id){
echo "<h1>call read</h1>";
$sql="SELECT session_data FROM sessions WHERE session_id='{$session_id}'";
$result=mysql_query($sql);
if($result && mysql_num_rows($result)>0){
$row=mysql_fetch_assoc($result);
return $row['session_data'];
}else{
return false;
}
}
function write($session_id,$session_data){
echo "<h1> call write </h1>";
$lifetime=get_cfg_var("session.gc_maxlifetime");
$session_update_time=time()+$lifetime;
$sql="INSERT sessions VALUES('{$session_id}','{$session_data}',{$session_update_time})";
$result=mysql_query($sql);
if(!$result){
$sql="UPDATE sessions SET session_data='{$session_data}',session_update_time='{$session_update_time}' WHERE session_id='{$session_id}' AND session_update_time>".time();
mysql_query($sql);
}
}
function destroy($session_id){
echo "<h1>call destroy</h1>";
$sql="DELETE FROM sessions WHERE session_id ='{$session_id}'";
echo $sql;
return mysql_query($sql);
}
function gc(){
echo "<h1>call gc</h1>";
}
session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');