php下使用无限生命期Session的方法


Posted in PHP onMarch 16, 2007

在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关联数组的10个操作技巧
Jan 21 PHP
基于PHP选项与信息函数的使用详解
May 10 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
WordPress中is_singular()函数简介
Feb 05 PHP
PHP进程同步代码实例
Feb 12 PHP
php中strlen和mb_strlen用法实例分析
Nov 12 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
在Laravel5中正确设置文件权限的方法
May 22 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 PHP
随时给自己贴的图片加文字的php水印
Mar 16 #PHP
php的一个登录的类 [推荐]
Mar 16 #PHP
对Session和Cookie的区分与解释
Mar 16 #PHP
PHP中cookies使用指南
Mar 16 #PHP
PHP学习资料汇总与网址
Mar 16 #PHP
PHP编码规范-php coding standard
Mar 16 #PHP
PHP操作文件方法问答
Mar 16 #PHP
You might like
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
php使用post数组的键值创建同名变量并赋值的方法
2015/04/03 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jQuery插件EnPlaceholder实现输入框提示文字
2015/06/05 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
详解Python的Django框架中的模版继承
2015/07/16 Python
Python实现的桶排序算法示例
2017/11/29 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
python openssl模块安装及用法
2020/12/06 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
国际商务专业学生个人的自我评价
2013/09/28 职场文书
计算机专业大学生的自我评价
2013/11/14 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android