使用无限生命期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 数组排序方法总结 推荐收藏
Jun 30 PHP
那些年一起学习的PHP(三)
Mar 22 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
Nov 03 PHP
php_pdo 预处理语句详解
Nov 21 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 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
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
js word表格动态添加代码
2010/06/07 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
2011/02/14 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
原生JS实现拖拽功能
2020/12/16 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
机械工程师求职自我评价
2013/09/23 职场文书
自荐书范文
2013/12/08 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书