作者 : Bun Wong
日期 : 2009年05月26日
标签 : PHP Drupal
浏览 : 1179 次
评论 : 0 个
http://www.hdwong.com/article/drupal-bootstrap-3.html

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

技术交流 @ 2009年05月26日 收藏&分享

接下来是 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) 是自动清除过期的会话记录

评论 (0)

还没有评论

* 昵称:

* 评论:

* 验证码: (请输入下图的 4 位数字)

Captcha看不请, 换一张

© 2011 Bun Wong

本博客基于 Bun PHP Framework 构建 • 粤ICP备07036370号