PHP session
Posted maps..xy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP session相关的知识,希望对你有一定的参考价值。
/* 【session】 */
1. 开启session机制
session_start()
注意:session_start()函数前不能有输出!除非开启ob缓存。
2. 操作数据
对$_SESSION数组进行操作
3. 浏览器端保存SessionID,默认为当前域名下的所有目录及其子目录生效。即默认设置cookie的path值为‘/‘
4. 服务器保存session数据
默认保存方式:每个会话都会生成一个session数据文件,文件名为:sess_加SessionID
5. session可以存储除了资源以外的任何类型数据。
数据被序列化后再保存到文件中。
6. $_SESSION的元素下标不能为整型!
因为只对元素值进行序列化。
元素内的数组下标无此要求。
7. 生存周期
默认是浏览器关闭
因为浏览器保存的cookie变量SessionID是临时的
但是服务器端的session数据文件不一定消失(需要等待session的垃圾回收机制来处理)
可以延长cookie中phpSESSID变量的生命周期。(不推荐)
php.ini配置session.gc_maxlifetime
8. 删除数据
$_SESSION变量在脚本结束时依然会消失。开启session机制时会造出$_SESSION变量。
$_SESSION与保存session数据的文件是两个空间。
unset($_SESSION[‘key‘])只是删除数组内的该元素,不会立即相应到保存session数据的文件上。
等到脚本结束,才会将$_SESSION的数据写入到该文件中。
session_destroy() 销毁保存session数据的文件,也不会对该文件写入内容。
并不删除$_SESSION变量,unset或脚本结束才会删除该变量。
如何完全删除一个session?需删除3部分
unset($_SESSION);
删除$_SESSION变量后,数据文件并未被改动。如果单独使用unset,则需先置空$_SESSION = array()
session_destroy();
setcookie(‘PHPSESSID‘, ‘‘, time()-1); //保险做法是将其生命周期失效
整个脚本周期内,只对数据文件读一次、写一次。
// 重写session的存储机制
# session存储方式
session.save_handler = user|files|memcache
# 因数据文件过多导致的问题,可通过分子目录保存进行解决
PHP配置文件下session.save_path选项,并需手动创建数据存放目录。
在该配置选项前加层级。分布子目录的原则,利用会话ID的相应字母来分配子目录。仍需手动创建子目录。
session.save_path = "2; F:/PHPJob/Temp"
# 多服务器数据共享问题
# 数据存储操作:
初始化$open、释放资源$close、读$read、写$write、销毁存储介质$destroy(调用session_destroy时触发该操作)、垃圾回收$gc
# 会话ID的长度可变。不同的设置方式导致不同长度的会话ID。
session.hash_function 允许用户指定生成会话ID的散列算法。
‘0‘ 表示MD5(128 位),‘1‘ 表示SHA-1(160 位)。
session.hash_bits_per_character 允许用户定义将二进制散列数据转换为可读的格式时每个字符存放多少个比特。
可能值为 ‘4‘(0-9,a-f),‘5‘(0-9,a-v),以及 ‘6‘(0-9,a-z,A-Z,"-",",")。
总hash长度为128bit,会话ID长度为128/可能值,4->32, 5->26, 6->22
# 自定义数据存储操作方法
# 注意:不用关心PHP如何序列化、反序列化、如何得到数据和写入数据,只做与数据存储相关的操作
session_set_save_handler 设置用户自定义的会话数据存储函数
bool session_set_save_handler(callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc)
执行顺序:open, close, r
以上是关于PHP session的主要内容,如果未能解决你的问题,请参考以下文章