You are here

Drupal专业开发指南 第16章 用法

g089h515r806 的头像
Submitted by g089h515r806 on 星期日, 2009-08-23 16:05

老葛的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地址同时登录,那么每个浏览器都有一个会话;因此,从一个浏览器退出不会影响用户在其它浏览器的登录状态。

Drupal版本: