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


留言 (0)