You are here

Drupal专业开发指南 第16章 会话相关设置

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

 

3个地方,可以修改Drupal的会话设置:.htaccess文件, settings.php文件, includes/bootstrap.inc文件中的引导指令代码。
 
在.htaccess文件中
    在Drupal安装的默认文件.htaccess中,使用下面一行代码关闭PHP的session.auto_start功能,这样在会话启动后,Drupal就确保拥有完全的控制能力了。代码如下:
 
php_value session.auto_start                0
 
    session.auto_start是一个配置选项,由于PHP在运行时不能改变它,所以将其放置在.htaccess文件中而不是settings.php中。
 
在settings.php文件中
    在settings.php文件中,你可以设置大部分的会话设置,该文件位于sites/default/
settings.php或者sites/example.com/settings.php。
 
ini_set('session.cache_expire',     200000); // 138.9 days
ini_set('session.cache_limiter',    'none');
ini_set('session.cookie_lifetime', 2000000); // 23.1 days
ini_set('session.gc_maxlifetime',   200000); // 55 hours
ini_set('session.save_handler',    'user'); // Use user-defined session handling.
ini_set('session.use_only_cookies',     1); // Require cookies.
ini_set('session.use_trans_sid',        0); // Don't use URL-based sessions.
 
    将这些设置放在settings.php中而不是.htaccess文件中,这就可以使子站点可以拥有不同的设置,并且在PHP作为CGI运行时(.htaccess中的PHP指令不能在这样的配置中工作),允许Drupal修改会话设置。
    Drupal使用函数ini_set('session.save_handler', 'user');来覆写由PHP提供的默认会话处理器,并实现它自己的会话管理。user-defined在这里的意思是“由Drupal定义的”(参看http://www.php.net/manual/en/function.session-set-save-handler.php)。
 
在bootstrap.inc文件中
    PHP提供了内置的会话处理函数,如果你想实现自己的会话处理器,那么PHP允许你覆写这些函数。这样PHP仍然负责cookie管理,而Drupal的实现则负责后台的会话存储。
    在引导指令中的DRUPAL_BOOTSTRAP_SESSION阶段,下面的代码将处理器设置为了includs/session.inc里面的函数,并启动会话处理:
 
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();
 
    在个别的时候,一个文件内部的函数名可以不使用文件名作为前缀,这里就是这样。你可能会认为前面的函数应该为session_open,session_close等等。然而,由于PHP在该命名空间下已经有了这些函数,所以这里使用了更简短的前缀sess_。
    注意,正被包含进来的文件是通过一个Drupal变量定义的。这意味着你完全可以实现自己的会话处理,并将其插入进来以代替Drupal的默认会话处理。例如,memcache模块(drupal.org/project/memcache)实现了函数'sess_open'、 'sess_close'、 'sess_read'、 'sess_write'、'sess_destroy_sid'、 'sess_gc'。将Drupal变量session_inc设置为这个会话代码,来代替使用默认的会话处理:
 
<?php
    variable_set('session_inc',         './sites/all/modules/memcache/memcache-session.inc');                  
?>
 
    通过在你的settings.php文件中设置该变量,你也可以实现对它的覆写:
 
$conf = array(
    'session_inc' => './sites/all/modules/memcache/memcache-session.inc,
    ...
);

老葛的Drupal培训班 Think in Drupal

Drupal版本: