您当前的位置: 首页 > 网站编程 > PHP教程 > 解析php session_set_save_handler 函数的用法(mysql)

解析php session_set_save_handler 函数的用法(mysql)

作者:不详 来源:网络 发布时间: 2014-08-20 13:35 点击:
本篇文章是对php中session_set_save_handler 函数的用法(mysql)进行了详细的分析介绍,需要的朋友参考下 复制代码 代码如下: ?php /*============================文件说明======================================== @filename: session.class.php @description: 数据

解析php session_set_save_handler 函数的用法(mysql)

  本篇文章是对php中session_set_save_handler 函数的用法(mysql)进行了详细的分析介绍,需要的朋友参考下

  复制代码 代码如下:

  <?php

  /*============================文件说明========================================

  @filename: session.class.php

  @description: 数据库保存在线用户session,实现在线用户功能!

  @notice: session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录。

  因此我们只记录用户登录的时间,而不是刷新一次更新一次

  删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory)

  @database: database:sessions field:sessionid(char32),uid(int10),last_visit(int10)

  =============================================================================

  */

  class session {

  private $db;

  private $lasttime=3600;//超时时间:一个小时

  function session(&$db) {

  $this->db = &$db;

  session_module_name('user'); //session文件保存方式,这个是必须的!除非在Php.ini文件中设置了

  session_set_save_handler(

  array(&$this, 'open'), //在运行session_start()时执行

  array(&$this, 'close'), //在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行

  array(&$this, 'read'), //在运行session_start()时执行,因为在session_start时,会去read当前session数据

  array(&$this, 'write'), //此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行

  array(&$this, 'destroy'), //在运行session_destroy()时执行

  array(&$this, 'gc') //执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc

  );

  session_start(); //这也是必须的,打开session,必须在session_set_save_handler后面执行

  }

  function unserializes($data_value) {

  $vars = preg_split(

  '/([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)|/',

  $data_value, -1, PREG_SPLIT_NO_EMPTY |

  PREG_SPLIT_DELIM_CAPTURE

  );

  for ($i = 0; isset($vars[$i]); $i++) {

  $result[$vars[$i++]] = unserialize($vars[$i]);

  }

  return $result;

  }

  function open($path, $name) {

  return true;

  }

  function close() {

  $this->gc($this->lasttime);

  return true;

  }

  function read($SessionKey){

  $sql = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";

  $query =$this->db->query($sql);

  if($row=$this->db->fetch_array($query)){

  return $row['uid'];

  }else{

  return "";

  }

  }

  function write($SessionKey,$VArray) {

  require_once(MRoot.DIR_WS_CLASSES .'db_mysql_class.php');

  $db1=new DbCom();

  // make a connection to the database... now

  $db1->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);

  $db1->query("set names utf8");

  $this->db=$db1;

  $SessionArray = addslashes($VArray);

  $data=$this->unserializes($VArray);

  $sql0 = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";

  $query0 =$this->db->query($sql0);

  if($this->db->num_rows($query0)<=0){

  if (isset($data['webid']) && !empty($data['webid'])) {

  $this->db->query("insert into `sessions` set `session_id` = '$SessionKey',uid='".$data['webid']."',last_visit='".time()."'");

  }

  return true;

  }else{

  /*$sql = "update `sessions` set ";

  if(isset($data['webid'])){

  $sql .= "uid = '".$data['webid']."', " ;

  }

  $sql.="`last_visit` = null "

  . "where `session_id` = '$SessionKey'";

  $this->db->query($sql); */

  return true;

  }

  }

  function destroy($SessionKey) {

  $this->db->query("delete from `sessions` where `session_id` = '$SessionKey'");

  return true;

  }

  function gc($lifetime) {

  $this->db->query("delete from `sessions` where unix_timestamp(now()) -`last_visit` > '".$this->lasttime."'");

  return true;

  }

  }

  ?>

  下面是php.ini中session的配置说明:

  
session.save_handler = "files"

  存储和检索与会话关联的数据的处理器名字。默认为文件("files")。

  如果想要使用自定义的处理器(如基于数据库的处理器),可用"user"。

  有一个使用PostgreSQL的处理器:http://sourceforge.net/projects/phpform-ext/

  session.save_path = "/tmp"

  传递给存储处理器的参数。对于files处理器,此值是创建会话数据文件的路径。

  Windows下默认为临时文件夹路径。

  你可以使用"N[MODE]/path"这样模式定义该路径(N是一个整数)。

  N表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。

  [MODE]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。

  这是一个提高大量会话性能的好主意。

  注意0: "N[MODE]/path"两边的双引号不能省略。

  注意1: [MODE]并不会改写进程的umask。

  注意2: php不会自动创建这些文件夹结构。请使用ext/session目录下的mod_files.sh脚本创建。

  注意3: 如果该文件夹可以被不安全的用户访问(比如默认的"/tmp"),那么将会带来安全漏洞。

  注意4: 当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。

  session.name = "PHPSESSID"

  用在cookie里的会话ID标识名,只能包含字母和数字。

  session.auto_start = Off

  在客户访问任何页面时都自动初始化会话,默认禁止。

  因为类定义必须在会话启动之前被载入,所以若打开这个选项,你就不能在会话中存放对象。

  session.serialize_handler = "php"

  用来序列化/解序列化数据的处理器,php是标准序列化/解序列化处理器。

  另外还可以使用"php_binary"。当启用了WDDX支持以后,将只能使用"wddx"。

  session.gc_probability = 1

  session.gc_divisor = 100

  定义在每次初始化会话时,启动垃圾回收程序的概率。

  这个收集概率计算公式如下:session.gc_probability/session.gc_divisor

  对会话页面访问越频繁,概率就应当越校建议值为1/1000~5000。

  session.gc_maxlifetime = 1440

  超过此参数所指的秒数后,保存的数据将被视为'垃圾'并由垃圾回收程序清理。

  判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。

  如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,

  那么将以所有session.gc_maxlifetime指令中的最小值为准。

  如果使用多层子目录来存储数据文件,垃圾回收程序不会自动启动。

  你必须使用一个你自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。

  比如,下面的脚本相当于设置了"session.gc_maxlifetime=1440" (24分钟):

  cd /path/to/sessions find -cmin +24 | xargs rm

  session.referer_check =

  如果请求头中的"Referer"字段不包含此处指定的字符串则会话ID将被视为无效。

  注意:如果请求头中根本不存在"Referer"字段的话,会话ID将仍将被视为有效。

  默认为空,即不做检查(全部视为有效)。

  session.entropy_file = "/dev/urandom"

  附加的用于创建会话ID的外部高熵值资源(文件),

  例如UNIX系统上的"/dev/random"或"/dev/urandom"

  session.entropy_length = 0

  从高熵值资源中读取的字节数(建议值:16)。

  session.use_cookies = On

  是否使用cookie在客户端保存会话ID

  session.use_only_cookies = Off

  是否仅仅使用cookie在客户端保存会话ID

  打开这个选项可以避免使用URL传递会话带来的安全问题。

  但是禁用Cookie的客户端将使会话无法工作。

  session.cookie_lifetime = 0

  传递会话ID的Cookie有效期(秒),0 表示仅在浏览器打开期间有效。

  session.cookie_path = "/"

  传递会话ID的Cookie作用路径。

  session.cookie_domain =

  传递会话ID的Cookie作用域。

  默认为空表示表示根据cookie规范生成的主机名。

  session.cookie_secure = Off

  是否仅仅通过安全连接(https)发送cookie。

  session.cookie_httponly = Off

  是否在cookie中添加httpOnly标志(仅允许HTTP协议访问),

  这将导致客户端脚本(JavaScript等)无法访问该cookie。

  打开该指令可以有效预防通过XSS攻击劫持会话ID。

  session.cache_limiter = "nocache"

  设为{nocache|private|public}以指定会话页面的缓存控制模式,

  或者设为空以阻止在http应答头中发送禁用缓存的命令。

  session.cache_expire = 180

  指定会话页面在客户端cache中的有效期限(分钟)

  session.cache_limiter=nocache时,此处设置无效。

  session.use_trans_sid = Off

  是否使用明码在URL中显示SID(会话ID)。

  默认是禁止的,因为它会给你的用户带来安全危险:

  1- 用户可能将包含有效sid的URL通过email/irc/QQ/MSN…途径告诉给其他人。

  2- 包含有效sid的URL可能会被保存在公用电脑上。

  3- 用户可能保存带有固定不变sid的URL在他们的收藏夹或者浏览历史纪录里面。

  基于URL的会话管理总是比基于Cookie的会话管理有更多的风险,所以应当禁用。

  session.bug_compat_42 = On

  session.bug_compat_warn = On

  PHP4.2之前的版本有一个未注明的"BUG":

  即使在register_globals=Off的情况下也允许初始化全局session变量,

  如果你在PHP4.3之后的版本中使用这个特性,会显示一条警告。

  建议关闭该"BUG"并显示警告。

  session.hash_function = 0

  生成SID的散列算法。SHA-1的安全性更高一些

  0: MD5 (128 bits)

  1: SHA-1 (160 bits)

  建议使用SHA-1。

  session.hash_bits_per_character = 4

  指定在SID字符串中的每个字符内保存多少bit,

  这些二进制数是hash函数的运算结果。

  4: 0-9, a-f

  5: 0-9, a-v

  6: 0-9, a-z, A-Z, "-", ","

  建议值为 5

  url_rewriter.tags = "a=href,area=href,frame=src,form=,fieldset="

  此指令属于PHP核心部分,并不属于Session模块。

  指定重写哪些HTML标签来包含SID(仅当session.use_trans_sid=On时有效)

  form和fieldset比较特殊:

  
如果你包含他们,URL重写器将添加一个隐藏的"<input>",它包含了本应当额外追加到URL上的信息。

  如果要符合XHTML标准,请去掉form项并在表单字段前后加上<fieldset>标记。

  注意:所有合法的项都需要一个等号(即使后面没有值)。

  
推荐值为"a=href,area=href,frame=src,input=src,form=fakeentry"。
分享到:
本文"解析php session_set_save_handler 函数的用法(mysql)"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4