您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

使用MySQL开始PHP会话

添加时间:2012-9-6 17:53:24  添加: 思海网络 
 默认情况下,PHP会话(session)是通过文件来保存的。这样做有以下几个缺点:

  会话文件一般都很小,但文件数却很多,在文件系统中保存许多这样的小文件非常浪费空间,且效率不高。

  分布式的站点难以利用会话文件来共享会话。

  会话文件方式不利于统计在线用户的会话信息。

  为解决以上问题,我们可以考虑用数据库来保存会话信息。

  对于 PHP 开发来说,保存会话用 MySQL 是一个非常不错的选择。MySQL 提供一种建立在内存中的表类型 Heap,如果每条会话数据量很小的话,可以考虑用这种类型的表来进一步优化性能。但是 Heap 类型的表有许多限制,例如它不支持 text 类型的字段,因此如果在无法预测会话数据记录长度的情况下,选择 MyISAM 是比较合适的,这种类型的表没有事物处理开销,对于基于磁盘的表可以得到最优性能。

  下面是 sessions 表的结构:

DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
 `session_id` varchar(32) NOT NULL default '',
 `user_id` int(10) unsigned NOT NULL default '0',
 `data_value` text NOT NULL,
 `last_visit` timestamp(14) NOT NULL,
 PRIMARY KEY (`session_id`),
 KEY `user_id` (`user_id`)
) TYPE=MyISAM;

  PHP 支持用户会话模块,可以通过 session_set_save_handler 来设置自定义的会话处理函数。因为默认的处理模块是 files,因此要在用 session_set_save_handler 设置会话处理函数之前,先用 session_module_name(’user’) 来告诉 PHP 使用用户会话模块, 而session_set_save_handler 必须要在 session_start 之前执行。

 用户会话数据在会话处理函数中都是序列化之后的,要取出其中的某个会话变量,可以对其进行反序列化,默认是 php 序列化方式,可以用 session::unserialize 函数来反序列化。

  下面的代码定义了一个用 MySQL 来处理 PHP 会话的类,其中所使用的 class_mysql.php 请参见 《超级简单但超级实用的 PHP 的 mysql 类》 。

<?php
/**
* @author 马秉尧
* @copyright (C) 2005 CoolCode.CN
*/
require_once("class_mysql.php");
class session {
  var $db;
  function session(&$db) {
    $this->db = &$db;
    session_module_name('user');
    session_set_save_handler(
      array(&$this, 'open'),
      array(&$this, 'close'),
      array(&$this, 'read'),
      array(&$this, 'write'),
      array(&$this, 'destroy'),
      array(&$this, 'gc')
    );
    session_start();
  }
  function unserialize($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; $vars[$i]; $i++) {
      $result[$vars[$i++]] = unserialize($vars[$i]);  
    }
    return $result;
  }
  function open($path, $name) {
    return true;
  }
  function close() {
    return true;
  }
  function read($session_id) {
    $session_id = $this->db->escape_string($session_id);
    if ($row = $this->db->query("select * from `sessions` where `session_id` = '$session_id' limit 1")) {
      return $row['data_value'];
    }
    else {
      $this->db->query("insert into `sessions` set `session_id` = '$session_id'");
      return "";
    }
  }
  function write($session_id, $data_value) {
    $data = $this->unserialize($data_value);
    $session_id = $this->db->escape_string($session_id);
    $data_value = $this->db->escape_string($data_value);
    $this->db->query("update `sessions` set " 
                . "`user_id` = '{$data['user_id']}', "
                . "`data_value` = '$data_value', "
                . "`last_visit` = null "
                . "where `session_id` = '$session_id'");
    return true;
  }
  function destroy($session_id) {
    $session_id = $this->db->escape_string($session_id);
    $this->db->query("delete from `sessions` where `session_id` = '$session_id'");
    return true;
  }
  function gc($lifetime) {
    $this->db->query("delete from `sessions` where unix_timestamp(now()) - unix_timestamp(`last_visit`) > $lifetime");
    return true;
  }
  // get sessions by user_id
  function get($user_id) {
    $user_id = $this->db->escape_string($user_id);
    return $this->db->query("select * from `sessions` where `user_id` = '$user_id'");
  }
  // get sessions list
  function lists($page, $rows) {
    if ($page == 0) {
      return $this->db->query("select * from `sessions` order by `user_id`");
    }
    else {
      $start = ($page - 1) * $rows;
      return $this->db->query("select * from `sessions` order by `user_id` limit $start, $rows");
    }
  }
}
?>

  这个类的使用很简单,在原来使用 session_start 的地方,替换成 $session = new session($db) 就可以了。$db 表示 sessions 表所在的数据库。

  另外可以用 get 方法来获取某个用户的所有会话信息,通过 lists 方法来得到所有用户会话列表。这样就可以方便的管理用户会话了。

关键字:数据库、MySQL、PHP会话

分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站