老葛的Drupal培训班 Think in Drupal
Drupal在多个重要的内部函数中,使用会话来存储临时信息,比如单个用户的状态或偏爱。例如,drupal_set_message()需要为用户传递状态消息或者错误消息,将消息从错误发生的页面传递到下一个页面中。在这里,我们将消息存储在用户会话中的一个名为messages的数组里面,从而完成传递。
/**
* Set a message which reflects the status of the performed operation.
*
* If the function is called with no arguments, this function returns all set
* messages without clearing them.
*
* @param $message
* The message should begin with a capital letter and always ends with a
* period '.'.
* @param $type
* The type of the message. One of the following values are possible:
* 'status', 'warning', 'error'
* @param $repeat
* If this is FALSE and the message is already set, then the message won't
* be repeated.
*/
function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
if ($message) {
if (!isset($_SESSION['messages'])) {
$_SESSION['messages'] = array();
}
if (!isset($_SESSION['messages'][$type])) {
$_SESSION['messages'][$type] = array();
}
if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
$_SESSION['messages'][$type][] = $message;
}
}
// Messages not set when DB connection fails.
return isset($_SESSION['messages']) ? $_SESSION['messages'] : NULL;
}
另一个例子来自于comment.module,在这里使用会话为匿名用户存储查看偏爱:
$_SESSION['comment_mode'] = $mode;
$_SESSION['comment_sort'] = $order;
$_SESSION['comment_comments_per_page'] = $comments_per_page;
在预览节点时,Drupal使用会话来处理文件上传。在“管理➤内容管理➤内容”中过滤站点内容列表时,Drupal用会话记住用户浏览偏爱,还有在“管理➤报告➤最新的日志条目”中过滤最新日志条目列表时,用的也是会话。而在安装和更新系统中,也使用了会话(install.php和update.php)。
对于登录用户和匿名用户,Drupal都为其都创建了会话。在表sessions中有一行表示匿名用户的记录,其中uid列被设置为了0.由于会话是特定于浏览器的(它们绑定在了浏览器的cookie上),这样,在单个计算机上打开多个浏览器就会有多个会话。
警告 在匿名用户初次访问一个站点时,Drupal并不为其存储会话信息。这样当恶意的网络爬虫和机器人访问站点时,就不会向sessions表中写入大量数据了。对于开发者来说,这意味着你不能为匿名用户的初次访问,存储会话信息。
存储在会话中的实际数据,是作为序列化数据存储在sessions表的session列中的。表16-1给出来一个典型的sessions表,它包含了3条记录。对于超级用户(uid 1),认证用户(uid 3),匿名用户(uid 0),都各有一条记录。对于超级用户,在其会话中,也就是session列,存储了看门狗过滤设置(用在dblog模块)。
表 16-1.来自sessions表的示例记录
uid sid hostname timestamp cache session
1 f5268d678333a1a7cce27e7e42b0c2e1 1.2.3.4 1208464106 0 dblog_overview_
filter|a:0:{}
3 be312e7b35562322f3ee98ccb9ce8490 5.6.7.8 1208460845 0 --
0 5718d73975456111b268ed06233d36de 127.0.0.1 1208461007 0 --
当PHP的会话垃圾收集器周期性运行时,就会清理sessions表。记录在表中的保留时限由settings.php中的session.gc.maxlifetime决定。如果用户退出,那么与之相关的会话记录将被立即从数据库中清除。注意,如果一个用户通过多个浏览器(而不是浏览窗口)或者多个IP地址同时登录,那么每个浏览器都有一个会话;因此,从一个浏览器退出不会影响用户在其它浏览器的登录状态。