使用无限生命期Session的方法


Posted in PHP onOctober 09, 2006

在PHP4.0中加入了对Session的支持,方便了我们很多程序,比如购物车等等!
在很多论坛中,Session也用于处理用户的登陆,记录下用户名和密码,使得用户不必每次都输入自己的用户名和密码!但是一般的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”;
3、session.cookie_lifetime:这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以Session不能永久使用!
4、session.gc_maxlifetime:这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除!
还有很多的设置,不过和本文相关的就是这些了,下面开始讲使用永久Session的原理和步骤。

前面说过,服务器通过SessionID来读取Session的数据,但是一般浏览器传送的SessionID在浏览器关闭后就没有了,那么我们只需要人为的设置SessionID并且保存下来,不就可以……
如果你拥有服务器的操作权限,那么设置这个非常非常的简单,只是需要进行如下的步骤:
1、把“session.use_cookies”设置为1,打开Cookie储存SessionID,不过默认就是1,一般不用修改;
2、把“session.cookie_lifetime”改为正无穷(当然没有正无穷的参数,不过999999999和正无穷也没有什么区别);
3、把“session.gc_maxlifetime”设置为和“session.cookie_lifetime”一样的时间;
设置完毕后,打开编辑器,输入如下的代码:
------------------------------------------------------------------------------------
<?
session_start();
session_register('count');
$count++;
echo $count;
?>
------------------------------------------------------------------------------------
然后保存为“session_check.php”,用浏览器打开“session_check.php”,看看显示的是不是“1”,再关闭浏览器,然后再打开浏览器访问“session_check.php”,如果显示“2”,那么恭喜了,你已经成功;如果失败的话,请检查你前面的设置。

但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过PHP程序改写SessionID来实现永久的Session数据保存。查查php.net的函数手册,可以见到有“session_id”这个函数:如果没有设置参数,那么将返回当前的SessionID,如果设置了参数,就会将当前的SessionID设置为给出的值……
只要利用永久性的Cookie加上“session_id”函数,就可以实现永久Session数据保存了!
但是为了方便,我们需要知道服务器设置的“session.name”,但是一般用户都没有权限查看服务器的php.ini设置,不过PHP提供了一个非常好的函数“phpinfo”,利用这个可以查看几乎所有的PHP信息!
------------------------------------------------------------------------------------
<title>PHP相关信息显示</title>
<?phpinfo()?>
------------------------------------------------------------------------------------
打开编辑器,输入上面的代码,然后在浏览器中运行这个程序,会见到PHP的相关信息(如图1所示)。其中有一项“session.name”的参数(图中已经标出),这个就是我们需要的服务器“session.name”,一般是“PHPSESSID”。
记下了SessionID的名称后,我们就可以实现永久的Session数据储存了!
打开编辑器,输入下面的代码:
------------------------------------------------------------------------------------
<?
session_start(); // 启动Session
session_register('count'); // 注册Session变量Count
if(isset($PHPSESSID)) {
session_id($PHPSESSID);
} // 如果设置了$PHPSESSID,就将SessionID赋值为$PHPSESSID,否则生成SessionID
$PHPSESSID = session_id(); // 取得当前的SessionID
$count++; // 变量count加1
setcookie('PHPSESSID', $PHPSESSID, time()+3156000); // 储存SessionID到Cookie中
echo $count; // 显示Session变量count的值
?>
------------------------------------------------------------------------------------

保存之后,利用和刚才拥有服务器权限时候的检测一样的方法,检测是否成功的保存了SessionID。

后记:
其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!关于Session的其他应用,可以参见zphp.com的文章。
最后,笔者的调试环境:Windows98DigExt(SE)+Apache+PHP 4.04。

PHP 相关文章推荐
PHP个人网站架设连环讲(四)
Oct 09 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
PHP系统命令函数使用分析
Jul 05 PHP
typecho插件编写教程(四):插件挂载
May 28 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
Jsonp劫持学习
Apr 01 PHP
图象函数中的中文显示
Oct 09 #PHP
使用php+xslt在windows平台上
Oct 09 #PHP
配置PHP使之能同时支持GIF和JPEG
Oct 09 #PHP
PHP输出控制功能在简繁体转换中的应用
Oct 09 #PHP
PHP 增加了对 .ZIP 文件的读取功能
Oct 09 #PHP
如何去掉文章里的 html 语法
Oct 09 #PHP
如何分别全角和半角以避免乱码
Oct 09 #PHP
You might like
我的论坛源代码(六)
2006/10/09 PHP
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
2009/05/25 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
js实现双色球效果
2020/08/02 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Python版中国省市经纬度
2020/02/11 Python
Delphi CS笔试题
2014/01/04 面试题
餐饮收银员岗位职责
2014/02/07 职场文书
办公室岗位职责
2014/02/12 职场文书
2014年教师节寄语
2014/04/03 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
保护环境建议书400字
2014/05/13 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
网络销售员岗位职责
2015/04/11 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js