PHP session会话操作技巧小结


Posted in PHP onSeptember 27, 2016

本文实例总结了PHP session会话操作技巧。分享给大家供大家参考,具体如下:

会话技术

session

将会话数据存储与服务器端,同时使会话数据可以区分浏览器
为每个会话数据建立独立的会话数据区(来存储当前会话的全部数据),每个会话数据区存在唯一的标志,同时浏览器端存储该唯一标识配对使用。
响应时给浏览器的session-id值也存储于浏览器端的cookie数据区。

php.ini:

session.auto_start = 0

session_start();

增删改查都是使用$_SESSION完成
跟操作普通数组一样操作$_SESSION数组,就可以完成对session数据的操作

session原理

存储于浏览器端cookie中的session-id,就是一个普通的cookie变量

 PHP session会话操作技巧小结

每个会话生成存储于服务器端的session数据区

默认的以文件的形式存储于服务器系统临时目录下

session.save_path = '/temp'

session数据属性

有效期:一个会话周期

有效路径:整站

有效域:当前域

是否仅安全连接传输:否

是否HTTPOnly:否

以上session数据的特征,都是由浏览器cookie中存储的session-id的特征所导致的。可见如果需要改变session数据的属性,则需更改存储session-id的cookie变量PHPSESSID的属性:

php.ini 存在该属性的设置:

仅安全连接传输:

; http://php.net/session.cookie-secure
;session.cookie_secure =

生命周期:

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0

有效路径:

; The path for which the cookie is valid.
; http://php.net/session.cookie-path
session.cookie_path = /

有效域:

; The domain for which the cookie is valid.
; http://php.net/session.cookie-domain
session.cookie_domain =

HTTPOnly:

; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript.
; http://php.net/session.cookie-httponly
session.cookie_httponly =

如果需要对默认属性进行修改,可通过以下方法:

1. 修改php.ini配置文件;

2. 在脚本中使用 ini_set(key,val) 进行设置配置的修改,仅在设置后的脚本周期内有效,要在 session_start() 前设置完毕;

3. 使用特定功能函数:

//session_set_cookie_params(有效期,有效路径,有效域,是否仅安全传输连接,是否HTTPOnly);
session_set_cookie_paramas(60,'/','me.com',true,true);
session_start();

session语法问题

session数据可以是任意的类型,因为session数据区的数据就是序列化后存储的。

$_SESSION['']的下标只能是字符串

session_start()前不应存在输出

session数据区

在脚本周期外,持久存储当前会话session数据

在脚本周期内,使用$_SESSION管理session数据

session 销毁

//删除当前会话对应的session数据区并关闭session机制(周期结束后无法持久化)
session_destroy();
//$_SESSION还是存在的

清空session数据

$_SESSION = array();

当前相关session的全部数据删除:

session_destroy();
unset($_SESSION);
setcookie('PHPSESSID',"",time()-1);
//PHPSESSID称之为session.name 可通过php.ini配置
//可通过session_name()获取当前值
; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

重写session存储机制(入库、入内存)

目的:

便于管理大量session数据
便于web服务器集群共享session数据

实现:

定义自定义的相关的存储处理函数
将其设置为session机制需要的存储函数(告知session机制,使用我们的函数完成存储处理)

session机制:

session_set_save_handler();

共需六个存储处理函数

begin、end、read、write、del、gc(垃圾回收)

需要在session_start()前使用

<?php
//session 开始执行时最早执行的一个存储相关方法,用于初始化存储操作的相关资源
function ses_beg(){
// echo 'begin</br>';
 $link = mysql_connect('127.0.0.1','root','root');
 mysql_query('set names utf8');
 mysql_select_db('session_override');
}
//在session机制关闭时执行的方法,最后一个执行的存储相关操作,用于收尾
function ses_end(){
 echo 'end</br>';
 return true;
}
//不需要负责反序列化操作,在读取之后脚本自动执行
function ses_read($ses_id){
// echo 'read</br>';
 $sql = "select session_content from session where session_id = '$ses_id'";
 $res = mysql_query($sql);
 if($row = mysql_fetch_assoc($res)){
 return $row['session_content'];
 }else{
 return '';
 }
}
//不需要序列化操作,在写入之前脚本会自动执行
function ses_write($ses_id,$ses_con){
// echo 'write</br>';
// echo $ses_id,$ses_con;
 $sql = "replace into session values( '$ses_id' , '$ses_con',unix_timestamp() )";
 echo $sql.'</br>';
 return mysql_query($sql);
}
//当调用session_destroy()时执行
function ses_del($ses_id){
// echo 'del</br>';
 $sql = "delete from session where session_id = '$ses_id'";
 return mysql_query($sql);
}
//session.gc_maxlifetime = 1440
//在开启session机制的过程中,有概率地执行垃圾回收机制
//session.gc_probability = 1
//session.gc_divisor = 1000
//@param session.gc_maxlifetime
//return boolean
function ses_gc($maxlifetime){
// echo 'gc</br>';
 ini_set('session.gc_divisor',2);
 $sql = 'delete from session_override where last_time<unix_timestamp()-'.$maxlifetime;
 return mysql_query($sql);
}
//filesPHP内置的session存储处理器
//重写session机制,应该改为user用户自定义
ini_set('session.save_handler','user');
//配置存储机制要在start之前,要保证session不自动开启
//session.auto_start=0
//.htacess php_flag session.auto_start 0
session_set_save_handler('ses_beg','ses_end','ses_read','ses_write','ses_del','ses_gc');
session_start();
$_SESSION['id'] = 'test';
session_destroy();

session 与 cookie

联系

都是会话技术的实现
session基于cookie

差异

Tables cookie session
会话数据存储位置 浏览器端 服务器端
安全性
数据传输量
支持会话数据量 有限制 4K 20个 无大小限制
支持数据类型 字符串 ALL

session数据持久化

浏览器端 session-id

session_set_params(3600)

服务器端 session数据区

ini_set('session.gc_maxlifetime','3600')

cookie禁用

常规情况下,cookie禁用,session不能使用

技术上可以通过get或者post方式向服务器携带session-id

//是否仅仅使用cookie携带session-id
ini_set('session.use_only_cookies','0');
//是否自动采用其它方式自动传session-id,不安全
ini_set('session.use_trans_sid','1');

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP的宝库目录--PEAR
Oct 09 PHP
PHP CKEditor 上传图片实现代码
Nov 06 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
Codeigniter的dom类用法实例
Jun 26 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
thinkPHP中多维数组的遍历方法
Jan 09 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
Feb 20 PHP
php把文件设置为插件的技巧方法
Feb 03 PHP
PHP简单预防sql注入的方法
Sep 27 #PHP
PHP数据对象PDO操作技巧小结
Sep 27 #PHP
PHP基于GD库的图像处理方法小结
Sep 27 #PHP
PHP文件上传操作实例详解
Sep 27 #PHP
PHP目录操作实例总结
Sep 27 #PHP
PHP文件操作实例总结
Sep 27 #PHP
PHP命名空间namespace用法实例分析
Sep 27 #PHP
You might like
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
jQuery 操作XML入门
2008/12/25 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
Jquery中children与find之间的区别详细解析
2013/11/29 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
python样条插值的实现代码
2018/12/17 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
2019/07/12 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
新闻学毕业生自荐信
2013/11/15 职场文书
幼师求职信
2014/06/23 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server