博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp里的session、cookie方法
阅读量:5908 次
发布时间:2019-06-19

本文共 7299 字,大约阅读时间需要 24 分钟。

thinkphp里,对于session和cookie的操作,不管是存值、获取、删除,均只有一个方法。现分享出来,供大家参考参考。

/** * session管理函数 * @param string|array $name session名称 如果为数组则表示进行session设置 * @param mixed $value session值 * @return mixed */function session($name='',$value='') {    $prefix   =  C('SESSION_PREFIX');    if(is_array($name)) { // session初始化 在session_start 之前调用        if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);        if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){            session_id($_REQUEST[C('VAR_SESSION_ID')]);        }elseif(isset($name['id'])) {            session_id($name['id']);        }        if('common' != APP_MODE){ // 其它模式可能不支持            ini_set('session.auto_start', 0);        }        if(isset($name['name']))            session_name($name['name']);        if(isset($name['path']))            session_save_path($name['path']);        if(isset($name['domain']))          ini_set('session.cookie_domain', $name['domain']);        if(isset($name['expire']))          ini_set('session.gc_maxlifetime', $name['expire']);        if(isset($name['use_trans_sid']))   ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);        if(isset($name['use_cookies']))     ini_set('session.use_cookies', $name['use_cookies']?1:0);        if(isset($name['cache_limiter']))   session_cache_limiter($name['cache_limiter']);        if(isset($name['cache_expire']))    session_cache_expire($name['cache_expire']);        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();            session_set_save_handler(                array(&$hander,"open"),                 array(&$hander,"close"),                 array(&$hander,"read"),                 array(&$hander,"write"),                 array(&$hander,"destroy"),                 array(&$hander,"gc"));         }        // 启动session        if(C('SESSION_AUTO_START'))  session_start();    }elseif('' === $value){         if(''===$name){            // 获取全部的session            return $prefix ? $_SESSION[$prefix] : $_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]);            }        }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{            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($prefix){            unset($_SESSION[$prefix][$name]);        }else{            unset($_SESSION[$name]);        }    }else{ // 设置session        if($prefix){            if (!isset($_SESSION[$prefix])) {                $_SESSION[$prefix] = array();            }            $_SESSION[$prefix][$name]   =  $value;        }else{            $_SESSION[$name]  =  $value;        }    }}/** * Cookie 设置、获取、删除 * @param string $name cookie名称 * @param mixed $value cookie值 * @param mixed $options cookie参数 * @return mixed */function cookie($name='', $value='', $option=null) {    // 默认设置    $config = array(        'prefix'    =>  C('COOKIE_PREFIX'), // cookie 名称前缀        'expire'    =>  C('COOKIE_EXPIRE'), // cookie 保存时间        'path'      =>  C('COOKIE_PATH'), // cookie 保存路径        'domain'    =>  C('COOKIE_DOMAIN'), // cookie 有效域名        'httponly'  =>  C('COOKIE_HTTPONLY'), // httponly设置    );    // 参数设置(会覆盖黙认设置)    if (!is_null($option)) {        if (is_numeric($option))            $option = array('expire' => $option);        elseif (is_string($option))            parse_str($option, $option);        $config     = array_merge($config, array_change_key_case($option));    }    if(!empty($config['httponly'])){        ini_set("session.cookie_httponly", 1);    }    // 清除指定前缀的所有cookie    if (is_null($name)) {        if (empty($_COOKIE))            return;        // 要删除的cookie前缀,不指定则删除config设置的指定前缀        $prefix = empty($value) ? $config['prefix'] : $value;        if (!empty($prefix)) {// 如果前缀为空字符串将不作处理直接返回            foreach ($_COOKIE as $key => $val) {                if (0 === stripos($key, $prefix)) {                    setcookie($key, '', time() - 3600, $config['path'], $config['domain']);                    unset($_COOKIE[$key]);                }            }        }        return;    }elseif('' === $name){        // 获取全部的cookie        return $_COOKIE;    }    $name = $config['prefix'] . str_replace('.', '_', $name);    if ('' === $value) {        if(isset($_COOKIE[$name])){            $value =    $_COOKIE[$name];            if(0===strpos($value,'think:')){                $value  =   substr($value,6);                return array_map('urldecode',json_decode(MAGIC_QUOTES_GPC?stripslashes($value):$value,true));            }else{                return $value;            }        }else{            return null;        }    } else {        if (is_null($value)) {            setcookie($name, '', time() - 3600, $config['path'], $config['domain']);            unset($_COOKIE[$name]); // 删除指定cookie        } else {            // 设置cookie            if(is_array($value)){                $value  = 'think:'.json_encode(array_map('urlencode',$value));            }            $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0;            setcookie($name, $value, $expire, $config['path'], $config['domain']);            $_COOKIE[$name] = $value;        }    }}

domain的设置,有几点要注意:

1.在setcookie中省略domain参数,那么domain默认为当前域名。

2.domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用。

那么cookie的作用域:

cookie的作用域是domain本身以及domain下的所有子域名。

cookie作用域必须有效。php里cookie作用域不能是localhost。

对于cookie,domain设置为localhost 或 127.0.0.1 会取不到值。只能是有效域名,或者置为空或者false。这里的有效期单位是秒。

转载于:https://www.cnblogs.com/52fhy/p/5074373.html

你可能感兴趣的文章
【转】IntentService的原理及使用
查看>>
python 函数之day3
查看>>
Oracle备份与恢复详解
查看>>
[转] 评 WOW技能天赋设计
查看>>
python3中的String
查看>>
【MongoDB】学习摘要
查看>>
第一篇
查看>>
poj3522Slim Span(暴力+Kruskal)
查看>>
实现程序互斥运行的几种方法
查看>>
用画刷在屏幕上写字
查看>>
Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)
查看>>
Spring的事务传播性与隔离级别以及实现事物回滚
查看>>
错误与技巧笔记
查看>>
SpriteBatch.Draw()的重载方法 使用
查看>>
WPF向系统发送消息 并传递结构体
查看>>
解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接...
查看>>
使用git建立远程仓库,让别人git clone下来
查看>>
spring cloud config 入门
查看>>
java poi reader常用API汇总
查看>>
[转载]从C#开发人员到Windows Phone 7高级开发人员只需3周 – 序
查看>>