最近公司项目也做的差不多了,终于有点时间来仔细研究一下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>