You are here

Drupal专业开发指南 第22章 运行cron

g089h515r806 的头像
Submitted by g089h515r806 on 星期五, 2009-09-04 11:13

运行cron

尽管设定cron是Drupal安装指令的第5步,但是它常被忽视,而这一忽视能够给站点带来不小的麻烦。如果在一Drupal站点上没有运行cron,那么数据库就会充满日志信息、过期的缓存数据、以及其它的统计数据,这些都是应该从系统中定期清除的。我们应该把它作为正常安装流程中的一部份,及早的配置cron,这是一个很好的实践经验。关于设定cron的更多信息,参看Drupal的INSTALL.txt文件中的步骤5。
 
提示 如果你处于一个非常特殊的环境下,在一个访问量很大的站点上cron却永远没有运行过或者它没有被充分的运行,你可以手工的进行一些属于cron管理的操作。你可以随时清空缓存表(TRUNCATE TABLE 'cache', TRUNCATE TABLE 'cache_filter', and TRUNCATE TABLE 'cache_page'),而它将会重新构造自己。还有,在情急之时,你可以清空watchdog和sessions表来重新控制一个失控的Drupal站点。删除watchdog记录意味着你将丢失所有的错误消息,它们可能指示站点的问题所在。如果你想保存这些数据,那么在清空表watchdog以前,先对它进行备份。清空sessions表会使当前已登录的用户退出系统。
 
自动节流
Drupal在核心中包含了一个名为throttle.module的模块。这一模块通过对当前在线用户数量进行采样来测量站点的负载,如果采样显示超过了管理员设置的极值,那么它将关闭一些功能。在你配置一个站点时,最好启用这一模块,这样当一个页面成为热门话题并带来极大的访问量时,它使你能够应付这种局面。然而,节流阀模块不是一个万能药。为了进行节流,该模块本身会带来不小的负担。你也应该考虑一下其它的解决方案,比如使用memcached。
 
启用节流阀模块
当你启用了节流阀模块,你将会注意到在模块管理页面多了一列复选框。也就是,除了选择是否启用一个模块以外,你还可以选择它能否被节流。被节流意味着当module_list()返回了一列启用的模块时,由于访问量过大,启用了节流阀的模块将不被包含在内;被节流的模块此时将被禁用。
很明显,你将需要小心的选择你想对哪些模块进行节流。一般选择功能不重要但是耗费CPU时间或者许多数据库查询的模块。核心模块不能被节流(因为它们是Drupal正常运行所必需的),但是它们能在站点处于节流时,够意识到节流并使用它们自己的措施用来降低处理时间。例如,区块模块不能被节流,但是独立的区块可以被节流,如图22-2所示。
 
22-2 当站点处于大的负载时,它将不展示头部的搜索表单和右边栏中“Who’s new” 和 “Who’s online”区块,但是左边栏的导航和用户登录区块以及页脚的“Powered by Drupal”区块总是被显示的。
 
配置节流阀模块
为了使节流机制能够起作用,你必须为其提供一个阀值和一个采样频率。当启用了节流阀模块时,阀值可以在“管理➤站点配置➤节流阀”中设置。
 
设置阀值
    可以输入两个阀值:节流开始所需要的最小匿名用户数和节流开始所需要的最小登录用户数。由于匿名用户占用的资源比验证用户小,所以匿名用户的阀值应该更高一些。实际值则依赖于你的个人站点。用户数必须是在一个给定的时间内测量的。这个时间周期在“Who’s online”区块中设置,并作为Drupal变量user_block_seconds_online存储起来。如果它没有被设置,那它默认为900秒(15分钟),如图22-3所示。
 
22-3.用户最后一次访问以后仍被作为“在线”的时间周期,可以在“Who’s online”区块设置的User activity字段中进行设置。
 
设置采样频率
为了判定站点的负载量,以决定是打开还是关闭节流机制,节流阀模块必须查询数据库。这为数据库服务器增加了额外的负担。使用“Auto-throttle probability limiter”来设置检查的频率(实际中有可能检查发生在一个给定请求上)。例如,选择20%,那么对于每5个请求就会采样一次。
 
使得模块和主题懂得节流(Throttle-Aware)
节流机制可能开着,也可能关着。当你编写自己的模块和主题时,你可以对节流阀的状态进行判断,例如:
 
// Get throttle status.
// We use module_invoke() instead of calling throttle_status() directly
// so this will still work when throttle.module is disabled.
$throttle = module_invoke('throttle', 'status');
 
if (!$throttle) {
// Throttle is off.
// Do nonessential CPU-intensive task here.
}
 
提示 如果你拥有大量的多媒体文件,这些文件不重要,但又是主题的一部分,需要提供给用户,当你的网站不堪重负时,你可以对这些文件进行节流来减少带宽的总量。
 

Drupal版本: