PHP将Session存储在NoSql中

Session存储在NoSql中


PHP中SESSION过期,指的是,超过多少时间不活动,则过期。 如果用户有活动,每次活动时session都会重新write一次。即你说的会自动更新最后的修改时间。 比如,session设置20分钟过期,用户每分钟刷新一次,连续刷新60次,那么一个小时他还是在线的。因为他没有超过20分钟未活动。

php session的工作机制:
    客户端在发送请求的时候,session 的修改时间(modifiedtime)会更新,存在时间会往后延迟gc_maxlifetime;
    php 中并没有一个 daemon 线程来扫描 session 目录里面的文件来判断,而是在每次请求的时候,按照gc_probability/gc_divisor的概率来决定是否启动一个GC(Garbage Collector),gc 的工作就是扫描 session目录,用当前时间减去modifiedtime,跟 gc_maxlifetime作比较来确定是否删除 session 文件;
    各个站点的请求都可能会触发 GC,且 GC 在工作时是不会区分站点的gc_maxlifetime的,这个意味着,如果不单独设置 session的 save_path而单独设置了的gc_maxlifetime可能会不起作用;
    GC 是按一定几率触发的,意味着服务器中可能会存在一些已经超时了的 session 文件。


在session存储在NOSQL的实际应用中,出现一个问题.
存储在redis中的session, 在value被清除之后, 会留下一个sessionId的key.
即: 
    用户登录时,在redis中写入一个string型的sessionId和value;
    用户退出时删除了sessionID下的value.
    此时该sessionId中value的数据时没有了,但是留下一个无用的key.
    
此时, 我想到,为避免这个问题.
用户登录时设置在redis中存储的sessionId,定一个过期时间.
用户每次刷新需要登录的页面,变重置过期时间.
设置session过期时间,为一个较长的时间.这样,用户长时间不操作,redis的key就会过期.
同时用户异常退出, session照样会被清除.


将session存储在Redis中

  • 操作流程即session常用配置

注释:
[ ] : 为可选项,非必选项.

在PHP.ini中配置:
# 与Redis相关的配置
;修改session以redis形式保存
session.save_handler = files			改为session.save_handler = redis
session.save_path = '/tmp'			改为session.save_path = "tcp://IP地址:端口[?auth=密码/?database=库号]"
# 其他常用配置
session.use_cookie = 1				配置session使用cookie存储SessionID功能
session.cookie_lifetime=0           SessionID在客户端Cookie中存活时间,默认0关闭浏览器即清除
session.gc_maxlifetime = 1440		配置session存活时间(秒)选配
session.cookie_lifetime = 0			存储sessionID的cookie生存时间,0为仅打开浏览器有效.
session.name=PHPSESSID              配置session名字
session.auto_start = 0				配置session不可自动开启session
session.gc_divisor=1000             垃圾回收机制触发的基数
session.gc_probability=1 		    垃圾回收触发的概率数 gc_probability/gc_divisor ,触发概率


在设置redis保存到redis时, 设置session路径时,如果redis有密码 
密码以	?auth=密码	的形式保存.
redis 服务器为了安全,bind的是127.0.0.1,为了外网能访问到,bind可以改为该服务器本身的ip;  ?database =几号库 可以选择session使用几号redis库.

PHP代码中使用:
# 设置session最大存活时间
ini_set('session.gc_maxlifetime', 3600);
# 设置session保存方式
ini_set("session.save_handler","redis");
# 设置session保存路径
ini_set("session.save_path","tcp://127.0.0.1:6379?auth=authpwd");
session_start();
$_SESSION['session']= 'session存入成功';
echo $_SESSION['session'];
# 打印sessionID
echo session_id().'<br/>';
# PHP代码获取session中所有的值
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
# redis用session_id作为key并且是以string的形式存储 通过该形式获取整个session中的值
echo $redis->get('PHPREDIS_SESSION:' . session_id());


注解:
session存在redis中以string的形式存储:
key: PHPREDIS_SESSION:SessionId 			如: PHPREDIS_SESSION:dih3h1tsvffnmieojo425gmoa3
varlue: 则是代码存在Session中的数据. 		如: $_SESSION['name'] = 'liuhao';




  • 参考文献

参考文献:	CSDN论坛作者ajaxDreamer

  网上有很多PHP.INI文件配置的中文说明,但是对于PHP初学者来说在进行PHP运行环境搭建配置时还是容易一头雾水,今天换一种角度来分享如何进行php.ini配置,以求达到解决实际问题的效果,开篇以PHP教程方式详细介绍如何通过php.ini来配置Session,以实现基本的Session应用。
  我们知道在利用PHP进行购物车、用户登录等交互式网站开发时,Session是一种很好的解决方法,如果采用XAMPP,AppServ等PHP安装包,一般情况下,PHP Session设置系统都会配置如果采用手动配置PHP运行环境,就需要我们通过php.ini来对Session进行配置,下面详细介绍如何进行Session配置。
  PHP运行环境说明
  我采用的是DedeAMPZ,PHP版本5.2.4,如果你是手动安装PHP运行环境,你需要将php.ini-dist或者php.ini-recommended重命名为php.ini,并将其复制在windows目录下。
  php.ini中的session配置说明
  下面介绍能让session运行的必要配置步骤
  手动配置PHP运行环境时,最容易遗忘的一项是服务器端session文件的存储目录配置工作,打开php.ini文件,搜索Session,找到session.save_path,默认值为/tmp,代表session文件保存在c:/tmp目录下,默认tmp目录并没有创建,你可以在c盘下创建tmp目录,或者创建一个其他目录,比如leapsoulcn,再修改session.save_path的值,并去掉;,即
  session.save_path = ‘/leapsoulcn’;
  注意事项:
  1、一般为了保证服务器的安全,session.save_path值最好设置为外网无法访问的目录,另外如果你是在Linux服务器下进行session配置,请务必同时配置此目录为可读写权限,否则在执行session操作时会报错。
  2、在使用session变量时,为了保证服务器的安全性,最好将register_globals设置为off,以保证全局变量不混淆,在使用session_register()注册session变量时,你可以通过系统全局变量$_SESSION来访问,比如你注册了leapsoulcn变量,你可以通过$_SESSION['leapsoulcn']来访问此变量。
  session.save_path配置其他说明事项,从php.ini配置文件翻译而来
  你可以使用”N;[MODE;]/path”这样模式定义该路径,N是一个整数,表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。
  [MODE;]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。[MODE;]并不会改写进程的umask。php不会自动创建这些文件夹结构。可使用ext/session目录下的mod_files.sh脚本创建。如果该文件夹可以被不安全的用户访问(比如默认的”/tmp”),那么将会带来安全漏洞。当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。
  如果你服务器上有多个虚拟主机,建议针对每个不同的虚拟主机分别设置各自不同的目录。
  至此最基本的session配置就完成了,你只要保存php.ini,并重启apache,即可使用session功能。
  其他session配置说明
  session.save_handler = ”files”
  默认以文件方式存取session数据,如果想要使用自定义的处理器来存取session数据,比如数据库,用”user”。
  session.use_cookies = 1
  是否使用cookies在客户端保存会话sessionid,默认为采用cookies
  session.use_only_cookies = 0
  是否仅仅使用cookie在客户端保存会话sessionid,这个选项可以使管理员禁止用户通过URL来传递id,默认为0,如果禁用的话,客户端如果禁用Cookie将使session无法工作。
  session.name = “PHPSESSID”
  当做cookie name来使用的session标识名
  session.auto_start = 0
  是否自动启动session,默认不启动,我们知道在使用session功能时,我们基本上在每个php脚本头部都会通过session_start()函数来启动session,如果你启动这个选项,则在每个脚本头部都会自动启动session,不需要每个脚本头部都以session_start()函数启动session,推荐关闭这个选项,采用默认值。
  session.cookie_lifetime = 0
  传递sessionid的Cookie有效期(秒),0表示仅在浏览器打开期间有效。
  session.gc_probability = 1
  session.gc_divisor = 100
  定义在每次初始化会话时,启动垃圾回收程序的概率。计算公式如下:session.gc_probability/session.gc_divisor,比如1/100,表示有1%的概率启动启动垃圾回收程序,对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。
  session.gc_maxlifetime = 1440
  设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,将以所有session.gc_maxlifetime指令中的最小值为准。
  如果你在session.save_path选项中设定使用子目录来存储session数据文件,垃圾回收程序不会自动启动,你必须使用自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。
  比如设置”session.gc_maxlifetime=1440″ (24分钟):
  cd /path/to/sessions; find -cmin +24 | xargs rm
  以上是一些常用的session配置选项说明,更多的session配置选项说明你可以参考php.ini文件中的说明。
  至此,在php.ini配置文件中对session进行配置的PHP教程就介绍完毕了,通过上面的步骤实践与学习,基本的session功能都可以使用,至于session性能等其他方面则需要根据服务器环境和需求进行微调了,这个得自己体会。


将session存储在memcache中

  • 操作流程
# 配置文件中配置
session.save_handler = memcache //设置session的储存方式为memcache   
memcache.hash_strategy = "consistent"//设置memcache的hash算法   
session.save_path = "tcp://127.0.0.100:11211" //设置session储存的位置,多台memcache用逗号隔开,例如:tcp://127.0.0.1:11211,tcp://127.0.0.1:12000  
// 设置session储存的位置,多台memcache用逗号隔开,比如”tcp://127.0.0.1:11211?weight=30,tcp://127.0.0.1:12000”

# PHP应用中设置
ini_set("session.save_handler", "memcache");  
ini_set("session.save_path", "tcp://127.0.0.1:11211"); 

# apach下的.htaccess 文件配置 
php_value session.save_handler "memcache"   
php_value session.save_path "tcp://127.0.0.1:11211"  

# 如果安装的PECL是memcached(依赖libmemcached库的那个扩展),则配置应为 
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache  
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:[/b] 


使用多个 memcached server 时用逗号","隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,类似这样的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。 


转载于:https://my.oschina.net/chinaliuhan/blog/3064872

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值