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 生成文字png图片的代码
Apr 17 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
php使用ICQ网关发送手机短信
Oct 30 PHP
php实现文件编码批量转换
Mar 10 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
php比较相似字符串的方法
Jun 05 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
php 获取文件行数的方法总结
Oct 11 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
laravel清除视图缓存的代码
Oct 23 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
星际争霸中的热键
2020/03/04 星际争霸
用PHP将数据导入到Foxmail
2006/10/09 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Python-基础-入门 简介
2014/08/09 Python
Django验证码的生成与使用示例
2017/05/20 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
服装促销活动方案
2014/02/23 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
安全先进班组材料
2014/12/26 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
Python装饰器详细介绍
2022/03/25 Python
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js