自从 PHP 4.0 中加入了对 session 的支持,越来越多的诸如购物车、论坛、会员系统等的开发案例就如雨后春笋一般出现了。一般而言,session 的生命期是有限的。如果用户关闭了浏览器,session 会自动失效。那么如何实现 session 的永久生命期呢?
session 储存在服务器端,根据客户端提供的 session_id 来得到这个用户的文件,然后读取文件,取得变量的值。session_id 可以使用客户端的 cookie 或者 http 1.1 协议的 query_string(也就是访问的 URL 的“?”后面的部分)来传送给服务器,然后服务器读取 session 的目录。
要实现 session 的永久生命期,首先需要了解一下 php.ini 关于 session 的相关设置(打开 php.ini 文件,在“[Session]”部分):
1、session.use_cookies:默认的值是“1”,代表 session_id 使用 cookie 来传递,反之就是使用 query_string 来传递;
2、session.name:这个就是 session_id 储存的变量名称,可能是 cookie,也可能是 query_string 来传递,默认值是“PHPSESSID”;
3、session.cookie_lifetime:这个代表 session_id 在客户端 cookie 储存的时间,默认是“0”,代表浏览器一关闭 session_id 就作废。正因为这个原因,session 不能永久使用;
4、session.gc_maxlifetime:这个是 session 数据在服务器端储存的时间,如果超过这个时间,session 数据就自动删除。
前面说过,服务器通过 session_id 来读取 session 的数据,但是一般浏览器传送的 session_id 在浏览器关闭后就没有了。只需要人为的设置 session_id 并且保存下来,理论上就可以实现无限生命期的 session。
如果拥有服务器的操作权限,那么设置会非常的简单,只是需要进行如下的步骤:
1、把“session.use_cookies”设置为“1”,打开 cookie 储存 session_id。一般默认就是“1”,不必再修改;
2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过 999999999 和正无穷也没有什么区别);
3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间。
设置完毕后,打开编辑器,输入如下代码:
<?php
session_start();
session_register('count');
$_SESSION['count'] = 0;
$_SESSION['count'] ++;
echo $_SESSION['count'];
?>
然后保存为“session_check.php”,用浏览器打开“session_check.php”,看看显示的是不是“1”;接着再关闭浏览器,然后再打开浏览器访问“session_check.php”,如果显示“2”,那么表明实验已经成功;如果失败的话,请检查前面的设置。
但是如果没有服务器的操作权限,那就比较麻烦了。需要通过 php 脚本改写 session_id 来实现永久的 session 数据保存。查看 php 手册,可以看到有“session_id”这个函数:如果没有设置参数,那么将返回当前的 session_id,如果设置了参数,就会将当前的 session_id 设置为给出的值。
只要利用永久性的 cookie 加上“session_id”函数,就可以实现永久 session 数据保存了。但是为了方便,需要知道服务器设置的“session.name”,可以利用“phpinfo”这个函数来查看到,一般是“PHPSESSID”。
记下了 session_id 的名称后,就可以实现永久的 session 数据储存了。打开编辑器,输入下面的代码:
<?php
session_start();
session_register('count');
if(isset($_SERVER['PHPSESSID'])) {
session_id($PHPSESSID);
}
$_SERVER['PHPSESSID'] = session_id();
$_SESSION['count'] ++;
setcookie('PHPSESSID', $_SERVER['PHPSESSID'], time()+3156000);
echo $_SESSION['count'];
?>
保存之后,利用和刚才拥有服务器权限时候的检测一样的方法,检测是否成功的保存了 session_id。
后记:
其实真正的永久储存是不可能的,因为 cookie 的保存时间有限,一旦清除了 cookie 上面的方法也就失效了;另外,服务器的存储空间也有限。但是对于一些需要保存时间比较长的站点,以上方法就已经足够了。
本文原载旧版博客 2005 年 9 月 18 日。虽然现在再看有些生涩,却有一定的实际应用价值。