Session [php]
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' , $handle ) or 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 [php]的更多相关文章
- session实现购物车
为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...
- Asp.net Core中使用Session
前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- Nhibernate的Session管理
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- zookeeper源码分析之六session机制
zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...
- [转载]Cookie/Session的机制与安全
Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道.本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题. 因 ...
- 修改session垃圾回收几率
<?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...
- Nginx反向代理,负载均衡,redis session共享,keepalived高可用
相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...
随机推荐
- sql 插入
今天处理了一个有关数据库表数据批量插入的问题.部分细节,自己之前没有遇到过.索性就整理下来,做个备忘录. 主要是将一个表的数据导入到另一张表中.这种插入方法,需注意两张表的对于字段的数据结构需要保持一 ...
- Kali Linux介绍篇
Kali Linux 官网:https://www.kali.org/ Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Linux 发行版,包含很多安全 ...
- MySQL运维及开发规范
一.基础规范 (1) 使用INNODB存储引擎 (2) 表字符集使用UTF8 (3) 所有表都需要添加注释 (4) 单表数据量建议控制在5000W以内 (5) 不在数据库中存储图.文件等大数据 (6) ...
- AngularJS(三)——指令实战及自定义指令
前言 上篇介绍了一些指令的应用,本篇介绍一些常用的用法格式. 内容 指令实战 下面通过输入一个名字实现实时更新文本内容. 需要的指令有: ng-app.ng-model.ng-bind.n-init ...
- linux heap堆分配
heap堆分配在用户层面:malloc函数用于heap内存分配 void* malloc(size_t size); 进程的虚拟内存地址布局: 对用户来说,主要关注的空间是User Space.将Us ...
- EM最大期望算法
[简介] em算法,指的是最大期望算法(Expectation Maximization Algorithm,又译期望最大化算法),是一种迭代算法,在统计学中被用于寻找,依赖于不可观察的隐性变量的概率 ...
- [題解](最小生成樹)luogu_P2916安慰奶牛
可以發現每個點經過次數恰好等於這個點的度數,所以把點權下放邊權,跑最小生成樹,原來邊權乘二在加上兩端點權,答案再加一遍起點最小點權 #include<bits/stdc++.h> #def ...
- react 的理念
命名式的编程方式: 命名式的编程方式,我们会有百分之六七十都在进行dom的操作. 1.声名式的开发: react是面向数据开发的,react是根据这个数据自动构建这个网站,可以把数据理解成图纸,rea ...
- 江西财经大学第一届程序设计竞赛 H
链接:https://www.nowcoder.com/acm/contest/115/H来源:牛客网 题目描述 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所 ...
- html一些常用的符号
< : < > : > & : & " : " @ : © ® : ...