php中的session相关
- session_name,实质是session文件前缀,和session_id构成针对不同用户的session文件,文件内存储了会话信息,会话信息主要是你存储到$_SESSION中的键值对;
- session_id,服务器针对不同用户生成的字符串,对于浏览器-服务器模式,可以不需要显示生成,浏览器请求服务端时会通过cooki发送session_id,通常格式是session_name = session_id;
- session_start,开启session,开启后才能存储键值对到对应的session文件;
- session_destroy清空session_id对应的文件;
- session_set_save_handler($class,TRUE)自定义session存储机制,如数据库存储等。
CodeIgniter(简称CI) 中对session的封装
CodeIgniter是一个MVC模式的php框架。
- CI_ession库封装了Session存储操作的常见方法,包括userdata,set_userdata,sess_destroy等,具体可查看官方手册;
- CI_session自带四种session存储方式,常见的文件file,还有数据库存储database,memcached,redis。对于文件之外的存储方式涉及到PHP内置会话存储机制之外的方式,需要自定义会话存储函数,使用到函数session_set_save_handler($class,TRUE);
- CI_session涉及到的session配置都在config文件中,session类中通过_config抓取。
session在Api接口中的应用
使用PHP开发Api接口时,我们使用session来存储用户会话信息,此时需要显示生成session_id和指定session_id($name),由于APP默认不发送cookie。APP第一次登陆,验证通过,开启session session_start;为该用户生成唯一的session_id,并返回给APP,然后存储用户信息到session文件;当用户再次请求其他接口时,通过session来做简易的安全过滤,APP通过指定参数signature来传递登录时获得的session_id,如果存在该session_id,并有有效用户信息,说明当前请求者是有效用户,给予调用相应接口的权限。
注意事项
- 登录时,先开启session_start(),然后生成session_id,再存储键值对;
- 登录后请求其他接口需要验证通过时,先获得signature,通过session_id($signature)指定session_id,再开启session_start,并获得用户的相关信息;
- 默认session的存储路径是系统盘的tmp,存储时间是1440(24分),对于APP而言这是不实际的,用户登录了希望不退出时永久有效,所以可以将session存储到指定目录下,如CI默认是cache目录;并通过ini_set(session.gc_maxlifetime)设置有效时间,常见做法是每次请求接口时都在当前时间上加时间(time()+7200),如果两小时内无任何操作session自动失效,APP端通常希望用户不退出,session永久有效。
CI_session库的缺点
- CI_session默认采用文件存储的方式将session文件存储在cache目录下,文件存储读写速度慢,用户量大时最好采用分布式缓存的方式存储到memcache或redis;
- CI_session中session存储文件默认不会自动删除,会造成空间浪费。