PHP中session有效期删除sess文件的方法_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

PHP中session有效期删除sess文件的方法

作者:黑客防线网安网站维护基地 来源:黑客防线网安网站维护基地 浏览次数:0

本篇关键词:sessionphp
黑客防线网安网讯:当我们执行session_start()之后,就会生成一个sessionID,保存在$_COOKIE变量中(此时,该sessionID并没有保存到客户端,他仅仅存在于会话之中)。
当我们执行session_start()之后就会生成一个sessionID保存在$_COOKIE变量中(此时,该sessionID并没有保存到客户端,他仅仅存在于会话之中)
同时服务器端默认会在/tmp目录下建立一个session文件,文件名是用前缀“sess_”再加上当前的sessionID组合而成的,我暂且把他叫做sess文件吧

cookie机制:
当使用cookie机制的时候,在sess文件中没有保存任何数据。而cookie中的数据,实际上是通过setcookie()的方法保存在客户端的。
并且,该方法只将指定的数据保存到了客户端,而sessionID并没有被保存到客户端。这个时候sessionID依然存在于会话之中。
当重新打开浏览器之后,我们发现当前的sessionID实际上已经不是之前的sessionID了,
但是cookie中的数据并不受影响,我们仍然可以通过$_COOKIE变量来获取cookie的值。

一般的session机制:
当使用session机制的时候,所有$_SESSION中的数据实际上是保存在了sess文件中,当我们在页面间跳转的时候,由于sessionID不变,
php会通过当前的sessionID找到sess文件,然后取出其中的数据,因此我们就可以通过$_SESSION变量来获session的值。
等到重启浏览器之后,由于sessionID变化了,所以也就取不到$_SESSION中的值了。

上面为什么说是一般的session机制呢,因为我们可以用一个php的函数:session_set_cookie_params()来实现cookie的机制。详情如下:
CODE:
// 取出当前的sessionID的设置
$cookieParams = session_get_cookie_params();

// 修改当前的sessionID的设置
session_set_cookie_params(
    3600,// 设置sessionID在cookie中保存的时长
    $cookieParams['path'],
    $cookieParams['domain'],
    $cookieParams['secure']
    );
// 重新生成一个新的sessionID
session_regenerate_id(true);
// 执行session_start()
// 注意,此时的session_start跟平时不一样的地方是,这个时候启动session的同时,他会把当前的sessionID保存到客户端的cookie中
session_start();

通过以上方法,这样在就算重启了浏览器,只要客户端的cookie文件不过期,
php会自动(不需要人工获取)通过cookie文件获取到上次访问时的sessionID,因此依然可以获取到之前设置的$_SESSION数据。
有的同学看到这里可能就会问了。sess文件不是有存活期的吗,生存期过了会怎么样?
这个我还没测试,我目前估计当存活期过了之后,用这个方法就取不到session中的值了。
因为sess文件都不存在了嘛。不过我们可以通过控制sess文件的存活期(修改php.ini中的session.gc_maxlifetime选项,默认是1440秒),来延长$_SESSION的访问。

但是我并不建议这么作,因为php的sess文件默认都是放在一个目录下的。也就是说默认情况下24分钟后,该sess文件就会被清理掉了。
如果我们想用session实现cookie,那么就得让sess文件一直保留。
假设一台服务器一天有10万个ip访问,那么服务器上就至少有不下于10万个sess文件。
如果你将sess文件保存的时间过长,甚至永久保存的话。
那么就会出问题了,同一个文件夹下堆积了过多的文件就会造成服务器访问该文件夹的时候出问题。
我们的服务器曾经发生过一次这种事故,具体堆积了多少个sess文件我忘记了。
但是我清楚的记得,我在tmp文件夹下甚至连执行删除的命令都会让终端死掉。最后是写了一个shell,慢慢删才删掉的。
当然重启服务器也可以,不过为了保证服务器的不间断,我们没有这么作。

第一种方法 在cmd中回车开开dos窗口
输入:del C:\windows\temp\sess* /s /q
第二种方法创建个批处理,使用计划任务多次定时调用即可!将下面文件保存后修改成 清理TEMP文件夹.bat

@echo off
del /f /s /q c:\windows\temp\*.*exit


phpmyadmin在使用过程中经常出现“登陆超时(1440秒未活动),请重新登录”,很烦

解决方法如下:

修改php.ini,找到

session.gc_maxlifetime = 1440

将数值改大就行了,然后使之生效

试验了一下,结果不好使。

最终解决方案:

找到 phpMyAdmin / libraries / config.default.php 文件,打开,修改

$cfg['LoginCookieValidity'] = 1440;

将1440修改成更大的值即可。

注意:$cfg['LoginCookieValidity']的值不能大于php.ini里的session.gc_maxlifetime的值,否则phpmyadmin 里会出现“您的 PHP 配置参数 session.gc_maxlifetime (外链,英文) 短于您在 phpMyAdmin 中设置的 Cookies 有效期,因此您的登录会话有效期将会比您在 phpMyAdmin 中设置的时间要更短。”错误。

下面黑客防线网安服务器维护基地着重讲一下原理!感兴趣学习的同学请往下看。

PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。
一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。但是,一般的小型网站,似乎没有必要这么劳师动众。
但是一般的Session的生命期有限,如果用户关闭了浏览器,就不能保存Session的变量了!那么怎么样可以实现Session的永久生命期呢?
大家知道,Session储存在服务器端,根据客户端提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……
要实现Session的永久生命期,首先需要了解一下php.ini关于Session的相关设置(打开php.ini文件,在“[Session]”部分):
1、session.use_cookies:默认的值是“1”,代表SessionID使用Cookie来传递,反之就是使用Query_String来传递;
2、session.name:这个就是SessionID储存的变量名称,可能是Cookie,也可能是Query_String来传递,默认值是“PHPSESSID”;
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-7601-1.html
网站维护教程更新时间:2012-02-23 01:04:06  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer