TP 学习之 session 方法的学习
最近公司项目也做的差不多了,终于有点时间来仔细研究一下Thinkphp 中的详细代码了,今天主要是看了一下TP session 方法的实现,然后就直接一边看,一边给代码一行行的加了注释!贴出来,自己记录一下,也供需要的人看一下!如果有注释的不对的地方,还请指出,共同学习!多谢多谢
。。。注释中还有一些小知识点是我们需要知道的,这个也要注意呢!
<span style="font-size:18px;">/**
* session管理函数
* @param string|array $name session名称 如果为数组则表示进行session设置
* @param mixed $value session值
* @return mixed
*/
function session($name="",$value="") {
// 取到 session 保存前缀
$prefix = C("SESSION_PREFIX");
// 如果传入的name 为一个数组,那么就是初始化session
if(is_array($name)) { // session初始化 在session_start 之前调用
// 如果配置中设置了 session 前缀属性, 则更改配置项中的session 前缀
if(isset($name["prefix"])) C("SESSION_PREFIX",$name["prefix"]);
// 如果 request 中的session_id 有值,则将session_id 设置成它(优先设置成request 中的)
if(C("VAR_SESSION_ID") && isset($_REQUEST[C("VAR_SESSION_ID")])){
session_id($_REQUEST[C("VAR_SESSION_ID")]);
// 否则就将 session_id 设置成传进来的值
}elseif(isset($name["id"])) {
session_id($name["id"]);
}
// 如果应用模式为 common 则将session 变成不能自动启动
if("common" == APP_MODE){ // 其它模式可能不支持
ini_set("session.auto_start", 0);
}
// 设置session 的name
if(isset($name["name"])) session_name($name["name"]);
// 设置session 存储的路径
if(isset($name["path"])) session_save_path($name["path"]);
// 设置domain
if(isset($name["domain"])) ini_set("session.cookie_domain", $name["domain"]);
// 设置session 的存在时间
if(isset($name["expire"])) {
ini_set("session.gc_maxlifetime", $name["expire"]);
ini_set("session.cookie_lifetime", $name["expire"]);
}
// 设置当页session 到下一页是否能够使用(这是个学习的点) ???session 在第二页不能使用了的原因以及解决办法????
// http://blog.163.com/freestyle_le/blog/static/1832794482012926725423/
if(isset($name["use_trans_sid"])) ini_set("session.use_trans_sid", $name["use_trans_sid"]?1:0);
// 设置 session_id 在客户端采用的存储方式为cookie,只有这样$_COOKIE["PHPSESSIONID"] 才会存在
if(isset($name["use_cookies"])) ini_set("session.use_cookies", $name["use_cookies"]?1:0);
// 指定回话页面所使用的缓存控制方法
/**
* 知识点:
* PHP中的 session_cache_limiter() 函数是指定会话页面所使用的缓冲控制方法。
* 语法:
* string session_cache_limiter ( [string cache_limiter])
* cache_limiter 要设置的缓存限制的名字
* 返回缓存限制的名字
*
* 但是要值得注意的是session_cache_limiter()方法要写在session_start()方法之前才有用。
*
* 实际应用:
*
* 在开发过程中,往往因为表单出错而返回页面的时候填写的信息都不见了,为了支持页面回跳,可以通过两种方法实现。
*
* 第一,使用Header方法设置消息头Cache-control
* header("Cache-control: private, must-revalidate");//支持页面回跳
*
* 第二,使用session_cache_limiter方法
* //注意要写在session_start方法之前
* session_cache_limiter("private, must-revalidate");//支持页面回跳
*
*/
if(isset($name["cache_limiter"])) session_cache_limiter($name["cache_limiter"]);
// 设置session 缓存时间
if(isset($name["cache_expire"])) session_cache_expire($name["cache_expire"]);
// 设置 session 存储方式 type: db file
if(isset($name["type"])) C("SESSION_TYPE",$name["type"]);
if(C("SESSION_TYPE")) { // 读取session驱动
$type = C("SESSION_TYPE");
$class = strpos($type,"\")? $type : "Think\Session\Driver\". ucwords(strtolower($type));
$hander = new $class();
// 这里有点不明白??????????????? & php 中的引用(貌似和c++似的)
session_set_save_handler(
array(&$hander,"open"),
array(&$hander,"close"),
array(&$hander,"read"),
array(&$hander,"write"),
array(&$hander,"destroy"),
array(&$hander,"gc"));
}
// 启动session 如果设置了自动启动
// 这是在配置好了以上配置之后才启动session 因为有些配置项需要在session 启动之前配置
if(C("SESSION_AUTO_START")) session_start();
}elseif("" === $value){
if(""===$name){ // 如果value 值恒等于空则判断 name的值是否为空,如果不为空则代表获取全部的session
// 获取全部的session
return $prefix ? $_SESSION[$prefix] : $_SESSION;
// 下面几个同级if 如果想要看懂,先看下手册这里:
// http://document.thinkphp.cn/manual_3_2.html#session
}elseif(0===strpos($name,"[")) { // session 操作
if("[pause]"==$name){ // 暂停session
session_write_close();
}elseif("[start]"==$name){ // 启动session
session_start();
}elseif("[destroy]"==$name){ // 销毁session
$_SESSION = array();
session_unset();
session_destroy();
}elseif("[regenerate]"==$name){ // 重新生成id
session_regenerate_id();
}
}elseif(0===strpos($name,"?")){ // 检查session
$name = substr($name,1);
if(strpos($name,".")){ // 支持数组
list($name1,$name2) = explode(".",$name);
return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
}else{
return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
}
// 如果传入的name = NULL || "" || 等等
}elseif(is_null($name)){ // 清空session
if($prefix) {
unset($_SESSION[$prefix]);
}else{
$_SESSION = array();
}
}elseif($prefix){ // 获取session
if(strpos($name,".")){
list($name1,$name2) = explode(".",$name);
return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;
}else{
return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;
}
}else{
// 不存在前缀,则根据 传入的name 获取
if(strpos($name,".")){ // 二维数组情况
list($name1,$name2) = explode(".",$name);
return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;
}else{ // 一位数组情况
return isset($_SESSION[$name])?$_SESSION[$name]:null;
}
}
// 如果值为空,名字不为空,则清空对应的值
}elseif(is_null($value)){ // 删除session
if(strpos($name,".")){
list($name1,$name2) = explode(".",$name);
if($prefix){
unset($_SESSION[$prefix][$name1][$name2]);
}else{
unset($_SESSION[$name1][$name2]);
}
}else{
if($prefix){
unset($_SESSION[$prefix][$name]);
}else{
unset($_SESSION[$name]);
}
}
// 值也不为空 名字既不为空也不为数组 绑定键值
}else{ // 设置session
if(strpos($name,".")){
list($name1,$name2) = explode(".",$name);
if($prefix){
$_SESSION[$prefix][$name1][$name2] = $value;
}else{
$_SESSION[$name1][$name2] = $value;
}
}else{
if($prefix){
$_SESSION[$prefix][$name] = $value;
}else{
$_SESSION[$name] = $value;
}
}
}
return null;
}</span>声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
