Bun Wong's Blog

专注于 Web 应用程序开发

深入 Drupal 引导流程 (3) - session_set_save_handler

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

case DRUPAL_BOOTSTRAP_SESSION:
  require_once variable_get('session_inc', './includes/session.inc');
  session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy_sid', 'sess_gc');
  session_start();
  break;

Drupal 使用 session_set_save_handler 来重载默认会话处理器,这个函数我还是第一次接触 -_-# 失礼,看看原型

bool session_set_save_handler( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )

第一个参数是打开会话时调用的处理器,接受两个参数 save_path 和 session_name,分别是会话保存路径 (要记得 PHP 默认机制是文件方式的,因此有文件路径) 和 COOKIE 中用于保存 SESSION ID 的键名,其中键名可以通过 session_name 来获取和修改

第二个参数是关闭会话时的处理器,没有参数

第三个参数是读取会话时的处理器,接受一个参数 session_id,代表 COOKIE 中保存的会话 ID

第四个参数是保存会话时的处理器,接受两个参数 session_id 和 session_data。官方手册中提及到,PHP 5.0.5 以后,close 和 write 处理器将会在类析构之后调用,因此处理器内不能使用类和抛出异常 (Exception 也是一个类) 而在析构函数内可以使用 SESSION,因此我们需要在程序中 (比如在 open 或者 read 处理器内) 声明一下保证让 session_write_close 在析构前完成

register_shutdown_function('session_write_close');

第五个参数是删除会话时的处理器,接受一个参数 session_id,代表 COOKIE 中保存的会话 ID

最后一个参数是会话过期时的处理器,接受一个参数 maxlifetime,代表超时秒数

打开 includes/session.inc,看 sess_read (line 17),read 处理器其实是 Drupal 恢复 $user 对象的过程,当检查 sessions 表有记录时,返回 $user 对象并设置角色,否则返回一个构造出来的游客用户; sess_write (line 56) 没啥好说,就是把数据保存到 sessions 表;sess_destroy_sid (line 128) 是在 sessions 表删除会话信息;sess_gb (line 142) 是自动清除过期的会话记录

000000

支持

鸡蛋

路过

雷人

我晕

好帅

留言 (0)

    发表留言

    Google Analytics

    最近一个月访问数:544