`
xuebingnanmm
  • 浏览: 172510 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

apache与php的session时间的修改

    博客分类:
  • PHP
阅读更多

在apache1.2以上的版本中,可以在httpd.conf里面设置:
  KeepAlive on
  KeepAliveTimeout 15
  这样就能限制每个session的保持时间是15秒。session的使用可以使得很多请求都可以通过同一个tcp连接来发送,节约了网络资源和系统资源

 


PHP中的session有效期默认是1440秒(24分钟)【注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。
    一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的session,精确地控制session的有效期。这也是基于PHP的大型网站常用的方法。但是,一般的小型网站,似乎没有必要这么劳师动众。
     但是一般的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”一样的时间;
    在PHP的文档中明确指出,设定session有效期的参数是session.gc_maxlifetime。可以在php.ini文件中,或者通过ini_set()函数来修改这一参数。问题在于,经过多次测试,修改这个参数基本不起作用,session有效期仍然保持24分钟的默认值。
    由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改)的值,来决定是否启动一个GC(Garbage Collector)。
   默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。GC的工作,就是扫描所有的session信息,用当前时间减去session的最后修改时间(modified date),同session.gc_maxlifetime参数进行比较,如果生存时间已经超过gc_maxlifetime,就把该session删除。
    到此为止,工作一切正常。那为什么会发生gc_maxlifetime无效的情况呢?
    在默认情况下,session信息会以文本文件的形式,被保存在系统的临时文件目录中。在Linux下,这一路径通常为\tmp,在 Windows下通常为C:\Windows\Temp。当服务器上有多个PHP应用时,它们会把自己的session文件都保存在同一个目录中。同样地,这些PHP应用也会按一定机率启动GC,扫描所有的session文件。
    问题在于,GC在工作时,并不会区分不同站点的session。举例言之,站点A的gc_maxlifetime设置为2小时,站点B的 gc_maxlifetime设置为默认的24分钟。当站点B的GC启动时,它会扫描公用的临时文件目录,把所有超过24分钟的session文件全部删除掉,而不管它们来自于站点A或B。这样,站点A的gc_maxlifetime设置就形同虚设了。
    找到问题所在,解决起来就很简单了。修改session.save_path参数,或者使用session_save_path()函数,把保存session的目录指向一个专用的目录,gc_maxlifetime参数工作正常了。
    严格地来说,这算是PHP的一个bug?
    还有一个问题就是,gc_maxlifetime只能保证session生存的最短时间,并不能够保存在超过这一时间之后session信息立即会得到删除。因为GC是按机率启动的,可能在某一个长时间内都没有被启动,那么大量的session在超过gc_maxlifetime以后仍然会有效。
    解决这个问题的一个方法是,把session.gc_probability/session.gc_divisor的机率提高,如果提到100%,就会彻底解决这个问题,但显然会对性能造成严重的影响。另一个方法是自己在代码中判断当前session的生存时间,如果超出了 gc_maxlifetime,就清空当前session。
    但是如果你没有服务器的操作权限,那就比较麻烦了,你需要通过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();
ini_set('session.save_path','/tmp/');
//6个钟头
ini_set('session.gc_maxlifetime',21600);
//保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");

后记:
其实真正的永久储存是不可能的,因为Cookie的保存时间有限,而服务器的空间也有限……但是对于一些需要保存时间比较长的站点,以上方法就已经足够了!
把session放入mysql的Example:
数据库里建表:session ( sesskey varchar32 , expiry int11 , value longtext)
code:
代码执行前已经连接数据库了。
复制代码 代码如下:
define('STORE_SESSIONS','mysql');
if (STORE_SESSIONS == 'mysql') {
if (!$SESS_LIFE = get_cfg_var('session.gc_maxlifetime')) {
$SESS_LIFE = 1440;
}
function _sess_open($save_path, $session_name) {
// 如果没有连接数据库,可以在此执行mysql_pconnect,mysql_select_db
return true;
}
function _sess_close() {
return true;
}
function _sess_read($key) {
$value_query = mysql_query("select value from sessions where sesskey = '" .addslashes($key) . "' and expiry > '" . time() . "'");
$value = mysql_fetch_array($value_query);
if (isset($value['value'])) {
return $value['value'];
}
return false;
}
function _sess_write($key, $val) {
global $SESS_LIFE;
$expiry = time() + $SESS_LIFE;
$value = $val;
$check_query = mysql_query("select count(*) as total from sessions where sesskey = '" . addslashes($key) . "'");
$check = mysql_fetch_array($check_query);
if ($check['total'] > 0) {
return mysql_query("update sessions set expiry = '" . addslashes($expiry) . "', value = '" . addslashes($value) . "' where sesskey = '" . addslashes($key) . "'");
} else {
return mysql_query("insert into sessions values ('" . addslashes($key) . "', '" . addslashes($expiry) . "', '" . addslashes($value) . "')");
}
}
function _sess_destroy($key) {
return mysql_query("delete from sessions where sesskey = '" . addslashes($key) . "'");
}
function _sess_gc($maxlifetime) {
mysql_query("delete from sessions where expiry < '" . time() . "'");
return true;
}
session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc');
}
danoo_session_name( 'dtvSid' );
danoo_session_save_path(SESSION_WRITE_DIRECTORY);

还是有点不明白,open,write那些参数哪里来的。
修改php.ini配置的两个常用函数:
get_cfg_var('session.gc_maxlifetime') : 取得session.gc_maxlifetime的值
ini_set('session.cookie_lifetime','0') : 设置session.cookie_lifetime的值为0。

 

 

[转]PHP session_set_save_handler

 

今天看手册,无意中看到了session_set_save_handler不解其意,于是上网搜寻得知,可以使用session_set_save_handler函数重载SESSION存储方式存储于MYSQL,样例如下:

1<?php    
2   $DB_SERVER = "server"; /* database server hostname */
3   $DB_NAME = "dbname"; /* database name */
4   $DB_USER = "root"; /* database user */
5   $DB_PASS = "*************"; /* database password */
6    
7   $DB_SELECT_DB = "";
8   $SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
9    
10  function sess_open($save_path, $session_name) {
11  global $DB_SERVER, $DB_NAME, $DB_USER, $DB_PASS, $DB_SELECT_DB;
12   
13  if (! $DB_SELECT_DB = mysql_pconnect($DB_SERVER, $DB_USER, $DB_PASS)) {
14  echo "SORRY! MYSQL ERROR : Can't connect to $DB_SERVER as $DB_USER";
15  echo "MySQL Error: ", mysql_error();
16  die;
17   }
18   
19  if (! mysql_select_db($DB_NAME, $DB_SELECT_DB)) {
20  echo "SORRY! MYSQL ERROR : Unable to select database $DB_NAME";
21  die;
22   }
23   
24  return true;
25   }
26   
27  function sess_close() {
28  return true;
29   }
30   
31  function sess_read($SessionKey){
32        global $DB_SELECT_DB, $SESS_LIFE;    
33        $Query = "SELECT SessionArray FROM cdb_global_sessions WHERE SessionKey = '".$SessionKey."' AND SessionExpTime > " . time();
34        $Result = mysql_query($Query, $DB_SELECT_DB);
35   
36  if (list($SessionArray) = mysql_fetch_row($Result)) {
37  return $SessionArray;
38   }
39   
40  return false;
41   }
42   
43  function sess_write($SessionKey, $VArray) {
44  global $DB_SELECT_DB, $SESS_LIFE;
45   
46  $SessionExpTime = time() + $SESS_LIFE;
47  $SessionArray = addslashes($VArray);
48   
49  $Query = "INSERT INTO cdb_global_sessions (SessionKey,SessionExpTime,SessionArray) VALUES ('".$SessionKey."','".$SessionExpTime."','".$SessionArray."')";
50  $Result = mysql_query($Query, $DB_SELECT_DB);
51   
52  if (!$Result){
53  $Query = "UPDATE cdb_global_sessions SET SessionExpTime = '".$SessionExpTime."', SessionArray = '".$SessionArray."' WHERE SessionKey = '".$SessionKey."' AND SessionExpTime > " . time();
54  $Result = mysql_query($Query, $DB_SELECT_DB);
55   }    
56  return $Result;
57   }
58   
59  function sess_destroy($SessionKey) {
60  global $DB_SELECT_DB;
61   
62  $Query = "DELETE FROM cdb_global_sessions WHERE SessionKey = '".$SessionKey."'";
63  $Result = mysql_query($Query, $DB_SELECT_DB);
64   
65  return $Result;
66   }
67   
68  function sess_gc($maxlifetime) {
69  global $DB_SELECT_DB;
70   
71  $Query = "DELETE FROM cdb_global_sessions WHERE SessionExpTime < " . time();
72  $Result = mysql_query($Query, $DB_SELECT_DB);
73   
74  return mysql_affected_rows($DB_SELECT_DB);
75   }
76   
77  session_set_save_handler(
78  "sess_open",
79  "sess_close",
80  "sess_read",
81  "sess_write",
82  "sess_destroy",
83  "sess_gc");
84session_start();
85  ?>

分享到:
评论
1 楼 hnlixf 2011-01-17  
兄弟,解释的太详细了,忠心感谢,以后会来你这里多拜访.

相关推荐

    upupw_Apache_PHP5.5

    UPUPW APACHE版环境集成包目录说明: 01、UPUPW.exe UPUPW控制面板主程序 02、Apache2 Apache web服务器软件目录 02、Backup UPUPW配置备份及出厂配置目录 03、FileZillaftp FileZilla server ftp程序目录 04、...

    php友情交流系统 php mysql apache

    单机调试推荐apache+php4+mysql,数据库管理用phpmyadmin;网络服务器需支持php4和mysql。 1.程序下载后用winzip解压缩。 2.配置文件在admin/config.inc.php。打开后修改数据库用户名和密码、管理员帐号及密码、页面...

    PHP100视频教程全集112集BT种子【PHP经典】

    PHP100视频教程32:PHP5中Cookie与 Session详解 PHP100视频教程33:PHP5中图片验证码的制作(上) PHP100视频教程34:PHP5中图片中文验证码(下) PHP100视频教程35:PHP5文字图片混合水印与缩略图 PHP100视频...

    基于PHP+MySQL实现注册登录

    1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime 3。 二、主要技术 本案例使用PHP 7中的PDO数据对象对MySQL数据库进行查询和插入操作,从而实现用户的登录和注册,同时用户...

    PHP中Fatal error session_start()错误解决步骤

    Fatal error: session_start() [function.session-start]: Failed to initialize storage module: files (path: ) in C:\usr\phpMyAdmin\libraries\session.inc.php on line 75 I.更改服务器配置: 1、检查error.log...

    解析PHP的session过期设置

    如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值),就将其删除,意味着这些session过期失效。 1. session在server端(一般是Apache with PHP ...

    PHP文件上传进度条插件js版 不需要修改php的session.upload-progress或安装额外的php模块等

    一,插件名 UploadiFive 二,apache或iis等服务器.需要修改文件上传大小时间等限制 三,文件默认上传到网站根目录的/Uploads/exe_file/目录中 四,默认不修改文件名,所以,上传的文件,不得有空格,中文斜线等非法字符

    PHP网络编程技术与实践 源码

    2.4.2 时间与日期的格式化输出 2.5 PHP的URL处理 2.5.1 URL字符串的处理 2.5.2 Base64 编码解码 2.6 本章小结 第3章 使用PHP创建动态页面 3.1 页面参数的传递 3.1.1 通过URL传递参数 3.1.2 通过表单传递参数 3.2 ...

    phpfilemanager-jupload-jupload-PHP-server-scripts整合

    正常运行,经常出现"Invalid Session"、"File size mismatch"等错 误,本人将Jupload 5.0.7源码包中samples.PHP/jupload.php文件进行 了相应修改,现在已经可以正常运行。(测试过的服务器环境是: Apache2.2.21 ...

    Jupload控件、服务器端PHP脚本

    经常出现"Invalid Session"、"File size mismatch"等错误,本人将Jupload 5.0.7源码包中samples.PHP/jupload.php文件进行了相应修改,现在已经可以正常运行。(测试过的服务器环境是:Apache2.2.21 PHP5.2)。 使用...

    php课程(共100多节)

    32:PHP5中Cookie与 Session详解 33:PHP5中图片验证码的制作(上) 34:PHP5中图片中文验证码(下) 35:PHP5文字图片混合水印与缩略图 36:PHP中正则表达式学习及应用(一) 37:PHP中正则表达式学习及应用(二) ...

    php学习笔记

    apache 34 PHP 36 数据类型 36 一.双引号与单引号 36 二.运算符 36 三.字符串拼接 36 四.类型运算符 36 五.switch语句 36 六.全局变量 37 七.预定义变量 37 函数 39 数组 40 一.用字符串做下标 40 二....

    PHP程序开发范例宝典III

    实例107 验证日期与时间的输入格式 161 4.3 文本与数值验证 163 实例108 验证表单元素是否为空 163 实例109 验证输入的数值是否在指定范围内 165 实例110 验证数据是否为数值型 166 实例111 验证用户名和...

    php网络开发完全手册

    1.4.3 使用phpinfo()确认Apache与PHP 1.4.3 的安装成功 12 1.4.4 Apache的启动与关闭 12 1.4.5 Apache的配置文件httpd.conf与 1.4.5 .htaccess的简介 13 1.4.6 PHP的配置文件php.ini的简介 13 1.4.7 PHP常用参数的...

    PHP开发实战1200例源码

    实例068 SESSION购物车中数据的读取 100 实例069 员工信息的管理 102 实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情图...

    PHPnow-1.4.5-20.7z

    不再自动覆盖 index.php 同时发布 Apache 2.2 和 2.0 两个不同版本 初始化端口占用时,可直接修改 session.save_path 改为 C:\WINDOWS\Temp 组件更新: ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    书名:《PHP开发实战1200例(第I卷)》(清华大学出版社.潘凯华.刘中华) PDF格式扫描版,全书分为5篇15章,共899页。2011年1月出版。 全书压缩打包成2部分,这是第1部分。 注:本系列图书的第I、II卷再版时均相应改名...

    单台服务器中利用Apache的VirtualHost如何搭建多个Web站点详解

    本文将详细记录一下如何在单台服务器上,利用apache的virtualhost(虚拟主机)来搭建多个不同的web站点,并且每个站点独立管理自己的session,下面话不多说了,来一起看看详细的介绍吧。 开发环境 先说下我各项开发...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    书名:《PHP开发实战1200例(第I卷)》(清华大学出版社.潘凯华.刘中华) PDF格式扫描版,全书分为5篇15章,共899页。2011年1月出版。 全书压缩打包成2部分,这是第2部分。 注:本系列图书的第I、II卷再版时均相应改名...

    PHP版企业网盘管理系统

    系统后台使用PHP+MYSQL实现,可由系统...7、根目录下的cache、office、files、session给写入、编辑和读取权限 8、配置好你的APACHE或IIS服务器,就可以访问当前系统了。 9、本系统的初始系统管理员是admin,密码123456

Global site tag (gtag.js) - Google Analytics