对于session的了解,以前一直没有仔细研究过,最近遇到了一些问题,须要解决session配置问题,就顺便查看了些资料。一下大可能是网上的资料,本身只是整理了下,若是有错误但愿能指出,感谢!php
先看下php.ini中session的相关配置的解释。使用 php -i|grep 'php.ini' 找到php.ini的文件目录位置,下面是php.ini配置内容。参考官网:SESSION配置html
[Session] ; 定义了来存储和获取与会话关联的数据的处理器的名字。默认为 files ; Handler used to store/retrieve data. ; http://php.net/session.save-handler ; 也能够将session存入到redis,对应的key:PHPREDIS_SESSION:d7sq31qsvtcpsl6khacn068dg3 ; session.save_handler = redis session.save_handler = files ; session.save_path 定义了传递给存储处理器的参数。若是选择了默认的 files 文件处理器,则此值是建立文件的路径。默认为 /tmp ; redis对应的设置 ; session.save_path = "tcp://127.0.0.1:6379?auth=123456" session.save_path = "/tmp" ; session.use_cookies 指定是否在客户端用 cookie 来存放会话 ID。默认为 1(启用)。 ; 若是为1的话,就能够在浏览器的Cookies中看到本次会话的sessionid session.use_cookies = 1
能够以chrome为例:redis
;指定是否在客户端仅仅使用 cookie 来存放会话 ID。。启用此设定能够防止有关经过 URL 传递会话 ID 的攻击。此设定是 PHP 4.3.0 添加的。自PHP 5.3.0开始,默认值改成1(启用) session.use_only_cookies = 1 ; Name of the session (used as cookie name). ; session.name 指定会话名以用作 cookie 的名字。只能由字母数字组成,默认为 PHPSESSID,对应session_name() session.name = PHPSESSID ; Initialize session on request startup. ; session.auto_start 指定会话模块是否在请求开始时自动启动一个会话。默认为 0(不启动) session.auto_start = 0 ; session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示“直到关闭浏览器”。默认为 0 ; Lifetime in seconds of cookie or, if 0, until browser is restarted. session.cookie_lifetime = 0 ; session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的几率。默认为 1 session.gc_probability = 1 ; session.gc_divisor 与 session.gc_probability 合起来定义了在每一个会话初始化时启动 gc(garbage collection 垃圾回收)进程的几率。此几率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每一个请求中有 1% 的几率启动 gc 进程。session.gc_divisor 默认为 100。 session.gc_divisor = 1000 ; session.gc_maxlifetime 指定过了多少秒以后数据就会被视为“垃圾”并被清除。 垃圾搜集可能会在 session 启动的时候开始( 取决于session.gc_probability 和 session.gc_divisor) ; After this number of seconds, stored data will be seen as 'garbage' and ; cleaned up by the garbage collection process. session.gc_maxlifetime = 3600
; 指定是否启用透明 SID 支持。默认为 0(禁用),好比可使用url传递若是设置为1 session.use_trans_sid = 0
参考这两篇文章:
如何设置一个严格30分钟过时的Session
php会话(session)生命周期概念介绍及设置更改和回收
session是由服务端建立的,php程序中若是php.ini中没有配置session.auto_start = 1的话,那么只有使用了session_start才会建立。
session_start() 会建立新会话或者重用现有会话。 若是经过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。当会话自动开始或者经过 session_start() 手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。 会话管理器多是 PHP 默认的, 也多是扩展提供的(SQLite 或者 Memcached 扩展), 也多是经过 session_set_save_handler() 设定的用户自定义会话管理器。 经过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据而且填充 $_SESSION 超级全局变量chrome
严格控制30分钟过时的Sessionapi
class Session{ /** * 设置session * @param [type] $name [description] * @param [type] $data [description] * @param integer $expire [description] */ public function set($name,$data,$expire = 300){ $sessionData = []; $sessionData['data'] = $data; $sessionData['expire'] = time() + $expire; $_SESSION[$name] = $sessionData; } /** * 获取session * @param [type] $name [description] * @return [type] [description] */ public function get($name){ if(!isset($_SESSION[$name])){ return false; } if($_SESSION[$name]['expire']>time()){ return $_SESSION[$name]['data']; }else{ self::clear($name); } return false; } /** * 清除session * @param [type] $name [description] * @return [type] [description] */ private static function clear($name){ if(isset($_SESSION[$name])){ unset($_SESSION[$name]); } } }
(1)最经常使用的可能就是存放用户的登陆信息了
(2)还有上面鸟哥说的存放优惠券等等浏览器
(1)千万不要在服务端使用setcookie()存放数据,这样很不安全安全
(2)session.auto_start = 0最好仍是使用0,若是是提供api服务的话,会生成不少session,占用资源cookie
session一致性架构设计分布式session存储session