Drupal 7 开发内部培训资料, 分头诗人

DRUPAL的SESSION读取,写入机制是怎样的?

赞成!
0
否决!

最近碰到个关于session的问题:

首先,我们都知道drupal的session是记录在表里的。他在boostrap文件里,使用session_set_save_handler方法重新定义过session的读取,写入。

在session.inc文件里放着重新定义的几个sess方法,比如sess_read,sess_write。

然而$_SESSION是数组的形式记录的,而sess_read和sess_write里读取和写入的,都是序列化后的产物(而且这个序列化和普通的序列化还不一样?!)。那么,drupal是在什么时候去做序列化的呢?sess_write中的传参是key和value,key是sess id,value已经是序列化后的string了。什么时候把$_SESSION给做成的这个特殊string呢?

3 个回答

赞成!
0
否决!

Drupal 是采用 PHP 内置的会话机制,但是它重载了 PHP 内置的会话处理器 (PHP 内建处理是把会话保存为文件方式的),把会话数据保存在数据库内。

可以使用session_set_save_handler函数重载SESSION存储方式存储于MYSQL,样例如下

<?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) { 
  global $DB_SERVER, $DB_NAME, $DB_USER, $DB_PASS, $DB_SELECT_DB; 
   
  if (! $DB_SELECT_DB = mysql_pconnect($DB_SERVER, $DB_USER, $DB_PASS)) { 
  echo "SORRY! MYSQL ERROR : Can't connect to $DB_SERVER as $DB_USER"; 
  echo "MySQL Error: ", mysql_error(); 
  die; 
  } 
   
  if (! mysql_select_db($DB_NAME, $DB_SELECT_DB)) { 
  echo "SORRY! MYSQL ERROR : Unable to select database $DB_NAME"; 
  die; 
  } 
   
  return true; 
  } 
   
  function sess_close() { 
  return true; 
  } 
   
  function sess_read($SessionKey){ 
        global $DB_SELECT_DB, $SESS_LIFE;    
        $Query = "SELECT SessionArray FROM cdb_global_sessions WHERE SessionKey = '".$SessionKey."' AND SessionExpTime > " . time(); 
        $Result = mysql_query($Query, $DB_SELECT_DB); 
   
  if (list($SessionArray) = mysql_fetch_row($Result)) { 
  return $SessionArray; 
  } 
   
  return false; 
  } 
   
  function sess_write($SessionKey, $VArray) { 
  global $DB_SELECT_DB, $SESS_LIFE; 
   
  $SessionExpTime = time() + $SESS_LIFE; 
  $SessionArray = addslashes($VArray); 
   
  $Query = "INSERT INTO cdb_global_sessions (SessionKey,SessionExpTime,SessionArray) VALUES ('".$SessionKey."','".$SessionExpTime."','".$SessionArray."')"; 
  $Result = mysql_query($Query, $DB_SELECT_DB); 
   
  if (!$Result){ 
  $Query = "UPDATE cdb_global_sessions SET SessionExpTime = '".$SessionExpTime."', SessionArray = '".$SessionArray."' WHERE SessionKey = '".$SessionKey."' AND SessionExpTime > " . time(); 
  $Result = mysql_query($Query, $DB_SELECT_DB); 
  }    
  return $Result; 
  } 
   
  function sess_destroy($SessionKey) { 
  global $DB_SELECT_DB; 
   
  $Query = "DELETE FROM cdb_global_sessions WHERE SessionKey = '".$SessionKey."'"; 
  $Result = mysql_query($Query, $DB_SELECT_DB); 
   
  return $Result; 
  } 
   
  function sess_gc($maxlifetime) { 
  global $DB_SELECT_DB; 
   
  $Query = "DELETE FROM cdb_global_sessions WHERE SessionExpTime < " . time(); 
  $Result = mysql_query($Query, $DB_SELECT_DB); 
   
  return mysql_affected_rows($DB_SELECT_DB); 
  } 
   
  session_set_save_handler( 
  "sess_open", 
  "sess_close", 
  "sess_read", 
  "sess_write", 
  "sess_destroy", 
  "sess_gc");
session_start();
  ?>
赞成!
0
否决!

thks 孤魂,所以你的意思是sess_write和sess_read里这种string的方法不是drupal加工后的产物,而是PHP自身就是如此的吗?

赞成!
0
否决!

是的,是php的东西