session的使用

Posted 小学员G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了session的使用相关的知识,希望对你有一定的参考价值。

启动会话 — 注册会话 — 使用会话 — 删除会话

 

1.session
(1)session存储在服务器的
(2)session每个人存一份
(3)session有默认的过期时间
(4)session里面可以存储任意类型的数据
安全,对服务造成压力
用法:
1.当一个页面需要使用session的时候,需要在页面顶部加session_start();
2.操作session
赋值 $_SEESION["uid"] = "";
取值 $_SESSINO["uid"]

2.cookie
(1)cookie存储在客户端的
(2)cookie每人存一份
(3)cookie没有默认过期时间
(4)cookie只能存储字符串
不安全,不会对服务器造成压力
用法:
1.操作cookie
赋值:setcookie(key,value)
取值:$_COOKIE["uid"]

 

1.启动会话

session_start()

通过session_register()函数创建会话

session_register()函数用来为会话登录一个变量来隐含地启动会话,但要求php.ini文件的选项,将register_globals指令设置on,

然后重新启动Apache服务器。

注意:调用session_register()时,不需要调用session_start()函数,PHP会在注册变量后隐含的调用session_start()函数。

2.注册会话

会话启动后,全部保存在$_SESSION中。通过数组$_SESSION创建一个会话变量很容易,只要直接该数组添加元素即可。

复制代码
<?php

session_start();          //启动session

$_SESSION["admin"] = null;    //生命一个admin的变量,并赋空值

?>
复制代码

 

3.使用会话

首先判断会话变量是否有一个会话ID存在,不存在就创建一个,并且使其能通过全局数组$_SESSION 进行访问。如存在,则讲这个会话变量载入以供用户使用。

例如,判断用户名Session会话变量是否为空,不为空则复制给$myvalue,

复制代码
<?php

if(!empty($_SESSION[\'session_name\']))

  $myvalue = $_SESSION[\'session_name\'];  

?>
复制代码

 

4.删除会话

  (1)删除单个会话

  使用unset(),但是不能使用unset($_SESSION) 函数会将全局变量$_SESSION销毁,无法恢复,用户也不能再注册$_SESSION 变量。

unset($_SESSION[\'user\']);

  (2)删除多个会话

$_SESSION = array();

  (3)结束会话

session_destroy();

session设置时间

1.客户端没禁止cookie

  (1) session_set_cookie_params() 必须在 session_start() 之前调用

<?php
$time = 1*60;              //设置Session失效时间
session_set_cookie_params($time);  //使用函数
session_start();             //初始化Session
$_SESSION[username] = \'mr\';
?>

 

说明:不推荐使用此函数,一些浏览器有问题。

  (2) 使用Setcookie()

复制代码
<?php

session_start();

$time = 1*60;                        //给出Session失效时间,1分钟

setcookie(session_name(),session_id(),time()+$time,"/");  //使用setcookie()手动设置Session失效时间

$_SESSION[\'user\']=\'mr\';

?>
复制代码

 

2.客户端禁止Cookie

  (1)登录之前打开Cookie,很多论坛这么做

  (2)通过GET方法,隐藏表单传递session_id  (常用)

  (3)使用文件或数据库存储session_id,页面传递中手动调用

 

 

======================分===========割============线================

Session高级应用

1.Session临时文件

session_save_path()存储session临时文件,可缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题

示例:

复制代码
<?php
$path = \'./tmp/\'; // 设置session存储路径
session_save_path($path);
session_start(); // 初始化session
$_SESSION[username] = true;
echo "Session文件名称为:sess_" , session_id();
?>
复制代码

注意:session_save_path()在session_start()函数之间

 

 

2.Session缓存

session缓存是将内容存储在IE客户端的Temporary Internet Files 文件夹下,可设置缓存时间,下次读取缓存内容,从而提速。

Session 缓存使用 session_cache_limiter() 函数

string session_cache_limiter([string cache_limiter])

  参数cache_limiter为public 或private。同时session缓存不在服务器端而是在客户端缓存,在服务器没显示。

  缓存时间,使用 session_cache_expire() 函数

int session_cache_expire([int new_cache_expire])

示例:

复制代码
<?php
session_cache_limiter(\'private\');
$cache_limit = session_cache_limiter();

session_cache_expire(30);
$cache_expire = session_cache_expire();

session_start();
?>
复制代码

 

3.session数据库存储

session_set_save_handler()函数

bool session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)



参数 说明
open(save_path,session_name) 找到session存储地址,去除变量
close() 不需要参数,关闭数据库
read(key) 读取session键值,key对应session_id
write(key,data) 其中data对应设置的session变量 
destroy(key) 注销session对应session键值
gc(expiry_time) 清除过期session记录

示例:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
function _session_open($save_path,$session_name)
{
    global $handle;
    $handle = mysql_connect(\'localhost\',\'root\',\'root\'or die(\'数据库连接失败\');       // 连接MYSQL数据库
    mysql_select_db(\'db_database11\',$handleor die(\'数据库中没有此库名\');               // 找到数据库
    return(true);
}
 
function _session_close()
{
    global $handle;
    mysql_close($handle);
    return(true);
}
 
function _session_read($key)
{
    global $handle;                         // 全局变量$handle 连接数据库
    $time = time();                         // 设定当前时间
    $sql "select session_data from tb_session where session_key = \'$key\' and session_time > $time";
    $result = mysql_query($sql,$handle);
    $row = mysql_fetch_array($result);
    if ($row)
    {
        return($row[\'session_data\']);           // 返回Session名称及内容
    }else
    {
        return(false);
    }
}
 
function _session_write($key,$data)
{
    global $handle;
    $time = 60*60;                                      // 设置失效时间
    $lapse_time = time() + $time;                       // 得到Unix时间戳
    $sql "select session_data from tb_session where session_key = \'$key\' and session_time > $lapse_time";
    $result = mysql_query($sql,$handle);
    if (mysql_num_rows($result) == 0 )              // 没有结果
    {
        $sql "insert into tb_session values(\'$key\',\'$data\',$lapse_time)";     // 插入数据库sql语句
        $result = mysql_query($sql,$handle);
    }else
    {
        $sql "update tb_session set session_key = \'$key\',session_data = \'$data\',session_time = $lapse_time where session_key = \'$key\'";                                               // 修改数据库sql语句
        $result = mysql_query($sql,$handle);
    }
    return($result);
}
 
function _session_destroy($key)
{
    global $handle;
    $sql "delete from tb_session where session_key = \'$key\'";                 // 删除数据库sql语句
    $result = mysql_query($sql,$handle);
    return($result);
}
 
function _session_gc($expiry_time)
{
    global $handle;
    $lapse_time = time();                                   // 将参数$expiry_time赋值为当前时间戳
    $sql "delete from tb_session where expiry_time < $lapse_time"// 删除数据库sql语句
    $result = mysql_query($sql,$handle);
    return($result);
}
 
session_set_save_handler(\'_session_open\',\'_session_close\',\'_session_read\',\'_session_write\',\'_session_destroy\',\'_session_gc\');
 
session_start();
 
$_SESSION[\'user\'] = \'mr\';
$_SESSION[\'pwd\'] = \'mrsoft\';
?>

======================分===========割============线================

以上是关于session的使用的主要内容,如果未能解决你的问题,请参考以下文章

一个队asp.net session进行了再次封装的C#类的代码

redis存储session配制方法

hibernate在使用getCurrentSession时提示no session found for current thread

少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

如何处理会话超时异常(使用 MVP 地点和活动)?

微信小程序代码片段