Commit 733d286b authored by Dries's avatar Dries

- Made it possible to auto-throttle blocks.  That is, blocks can be
  configured to be disabled when under excessive load.  Patch by Jeremy.
parent fa5aca1e
......@@ -6,6 +6,7 @@ Drupal x.x.x, xxxx-xx-xx
* made it possible to disable the "comment viewing controls".
- performance:
* improved module loading when serving cached pages.
* made it possible to automatically disable blocks when under heavy load.
- theme system:
* made all theme functions start with 'theme_'.
* made all theme functions return their output.
......
......@@ -34,7 +34,8 @@ CREATE TABLE [dbo].[blocks] (
[weight] [smallint] NOT NULL ,
[region] [smallint] NOT NULL ,
[path] [varchar] (255) NOT NULL ,
[custom] [smallint] NOT NULL
[custom] [smallint] NOT NULL,
[throttle] [smallint] NOT NULL
) ON [PRIMARY]
GO
......
......@@ -53,7 +53,8 @@ CREATE TABLE blocks (
weight tinyint(1) DEFAULT '0' NOT NULL,
region tinyint(1) DEFAULT '0' NOT NULL,
path varchar(255) DEFAULT '' NOT NULL,
custom tinyint(2) DEFAULT '0' NOT NULL
custom tinyint(2) DEFAULT '0' NOT NULL,
throttle tinyint(1) DEFAULT '0' NOT NULL
) TYPE=MyISAM;
--
......
......@@ -51,7 +51,8 @@ CREATE TABLE blocks (
weight smallint NOT NULL default '0',
region smallint NOT NULL default '0',
path varchar(255) NOT NULL default '',
custom smallint NOT NULL default '0'
custom smallint NOT NULL default '0',
throttle smallint NOT NULL default '0'
);
--
......
......@@ -173,7 +173,7 @@ function service() {
$payload="<?xml version=\"1.0\"?>\n" .
$this->serializeDebug() .
$r->serialize();
Header("Content-type: text/xml\r\nContent-Length: " .
Header("Content-Type: text/xml\r\nContent-Length: " .
strlen($payload));
print $payload;
}
......
......@@ -40,7 +40,7 @@ function block_help($section = "admin/help#block") {
$output = t("Controls the boxes that are displayed around the main content.");
break;
case 'admin/system/block':
$output = t("Blocks are the boxes in the left- and right- side bars of the web site, depending on the choosen theme. They are created by <b>active</b> Drupal modules. In order to view a block it must be enabled. You can assign the block's placement by giving it a region and a weight. The region specifies which side of the page the block is on, and the weight sorts blocks within a region. Lighter (smaller weight value) blocks \"float up\" towards the top of the page. The path setting lets you define which pages you want a block to be shown on. The custom checkbox lets your users hide the block using their account setting. You can also create your own blocks, where you specify the content of the block rather than its being generated by a module (you can even use PHP in these). You can create one of these by clicking the %createblock link in the menu to the left. Edit and delete links will become active below for these customized blocks.", array("%createblock" => l(t("new block"), "admin/system/block/add")));
$output = t("Blocks are the boxes in the left- and right- side bars of the web site, depending on the choosen theme. They are created by <b>active</b> Drupal modules. In order to view a block it must be enabled. You can assign the block's placement by giving it a region and a weight. The region specifies which side of the page the block is on, and the weight sorts blocks within a region. Lighter (smaller weight value) blocks \"float up\" towards the top of the page. The path setting lets you define which pages you want a block to be shown on. The custom checkbox lets your users hide the block using their account setting. You can also create your own blocks, where you specify the content of the block rather than its being generated by a module (you can even use PHP in these). You can create one of these by clicking the %createblock link in the menu to the left. Edit and delete links will become active below for these customized blocks. Blocks can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking auto-throttle. The auto-throttle functionality must be enabled on the %throttle.", array("%createblock" => l(t("new block"), "admin/system/block/add"), "%throttle" => l(t("throttle configuration page"), "admin/system/modules/throttle")));
break;
case 'admin/system/block/add':
$output = t("Here you can create a custom content block. Once you have created this block you must make it active, and give it a place on the page using %overview. The title is used when displaying the block. The description is used in the \"block\" column on the %overview page. If you are going to place PHP code in the block, and you have <b>create php content</b> permission (see the %permission page) you <b>must</b> change the type to PHP to make your code active.", array("%overview" => l(t("blocks"), "admin/system/block"), "%permission" => l(t("permissions"), "admin/user/permission")));
......@@ -90,8 +90,8 @@ function block_block($op = "list", $delta = 0) {
function block_admin_save($edit) {
foreach ($edit as $module => $blocks) {
foreach ($blocks as $delta => $block) {
db_query("UPDATE {blocks} SET region = %d, status = %d, custom = %d, path = '%s', weight = %d WHERE module = '%s' AND delta = '%s'",
$block["region"], $block["status"], $block["custom"], $block["path"], $block["weight"], $module, $delta);
db_query("UPDATE {blocks} SET region = %d, status = %d, custom = %d, path = '%s', weight = %d, throttle = %d WHERE module = '%s' AND delta = '%s'",
$block["region"], $block["status"], $block["custom"], $block["path"], $block["weight"], $block["throttle"], $module, $delta);
}
}
......@@ -125,6 +125,7 @@ function _block_rehash($order_by = array("weight")) {
$block["region"] = $old_blocks[$module][$delta]->region;
$block["path"] = $old_blocks[$module][$delta]->path;
$block["custom"] = $old_blocks[$module][$delta]->custom;
$block["throttle"] = $old_blocks[$module][$delta]->throttle;
}
else {
$block["status"] = $block["weight"] = $block["region"] = $block["custom"] = 0;
......@@ -132,8 +133,8 @@ function _block_rehash($order_by = array("weight")) {
}
// reinsert blocks into table
db_query("INSERT INTO {blocks} (module, delta, status, weight, region, path, custom) VALUES ('%s', '%s', %d, %d, %d, '%s', %d)",
$block["module"], $block["delta"], $block["status"], $block["weight"], $block["region"], $block["path"], $block["custom"]);
db_query("INSERT INTO {blocks} (module, delta, status, weight, region, path, custom, throttle) VALUES ('%s', '%s', %d, %d, %d, '%s', %d, %d)",
$block["module"], $block["delta"], $block["status"], $block["weight"], $block["region"], $block["path"], $block["custom"], $block["throttle"]);
$blocks[] = $block;
......@@ -153,7 +154,7 @@ function block_admin_display() {
$blocks = _block_rehash();
$header = array(t("block"), t("enabled"), t("custom"), t("weight"), t("region"), t("path"), array("data" => t("operations"), "colspan" => 2));
$header = array(t("block"), t("enabled"), t("custom"), t("throttle"), t("weight"), t("region"), t("path"), array("data" => t("operations"), "colspan" => 2));
foreach ($blocks as $block) {
if ($block["module"] == "block") {
......@@ -165,7 +166,10 @@ function block_admin_display() {
$delete = "";
}
$rows[] = array($block["info"], array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][status", 1, $block["status"]), "align" => "center"), array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][custom", 1, $block["custom"]), "align" => "center"), form_weight(NULL, $block["module"]."][".$block["delta"]."][weight", $block["weight"]), form_radios(NULL, $block["module"]."][".$block["delta"]."][region", $block["region"], array(t("left"), t("right"))), form_textfield(NULL, $block["module"]."][".$block["delta"]."][path", $block["path"], 10, 255), $edit, $delete);
$rows[] = array($block["info"], array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][status", 1, $block["status"]), "align" => "center"), array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][custom", 1, $block["custom"]), "align" => "center"),
array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][throttle", 1, $block["throttle"], NULL, variable_get("statistics_enable_auto_throttle", 0) ? NULL : array("disabled" => "disabled")), "align" => "center"),
form_weight(NULL, $block["module"]."][".$block["delta"]."][weight", $block["weight"]), form_radios(NULL, $block["module"]."][".$block["delta"]."][region", $block["region"], array(t("left"), t("right"))), form_textfield(NULL, $block["module"]."][".$block["delta"]."][path", $block["path"], 10, 255),
$edit, $delete);
}
$output = theme("table", $header, $rows);
......@@ -373,7 +377,17 @@ function block_list($region) {
while ($result && ($block = db_fetch_array($result))) {
if ((($block['status'] && (!$user->uid || !$block['custom'])) || ($block['custom'] && $user->block[$block['module']][$block['delta']])) && (!$block['path'] || preg_match($block['path'], str_replace("?q=", "", request_uri())))) {
$block = array_merge($block, module_invoke($block['module'], 'block', 'view', $block['delta']));
/*
** If congestion control is enabled, check current throttle status
** and see if block should be displayed based on server load.
*/
if ((module_invoke("throttle", "status") < 5) && $block['throttle'] && variable_get("statistics_enable_auto_throttle", 0)) {
$block['content'] = t('This block has been temporarily disabled as we are currently experiencing excessive load on our webserver. The block will be automatically reenabled when the webserver is less busy.');
}
else {
$block = array_merge($block, module_invoke($block['module'], 'block', 'view', $block['delta']));
}
if ($block['content']) {
$blocks[$region]["$block[module]_$block[delta]"] = (object) $block;
}
......
......@@ -40,7 +40,7 @@ function block_help($section = "admin/help#block") {
$output = t("Controls the boxes that are displayed around the main content.");
break;
case 'admin/system/block':
$output = t("Blocks are the boxes in the left- and right- side bars of the web site, depending on the choosen theme. They are created by <b>active</b> Drupal modules. In order to view a block it must be enabled. You can assign the block's placement by giving it a region and a weight. The region specifies which side of the page the block is on, and the weight sorts blocks within a region. Lighter (smaller weight value) blocks \"float up\" towards the top of the page. The path setting lets you define which pages you want a block to be shown on. The custom checkbox lets your users hide the block using their account setting. You can also create your own blocks, where you specify the content of the block rather than its being generated by a module (you can even use PHP in these). You can create one of these by clicking the %createblock link in the menu to the left. Edit and delete links will become active below for these customized blocks.", array("%createblock" => l(t("new block"), "admin/system/block/add")));
$output = t("Blocks are the boxes in the left- and right- side bars of the web site, depending on the choosen theme. They are created by <b>active</b> Drupal modules. In order to view a block it must be enabled. You can assign the block's placement by giving it a region and a weight. The region specifies which side of the page the block is on, and the weight sorts blocks within a region. Lighter (smaller weight value) blocks \"float up\" towards the top of the page. The path setting lets you define which pages you want a block to be shown on. The custom checkbox lets your users hide the block using their account setting. You can also create your own blocks, where you specify the content of the block rather than its being generated by a module (you can even use PHP in these). You can create one of these by clicking the %createblock link in the menu to the left. Edit and delete links will become active below for these customized blocks. Blocks can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking auto-throttle. The auto-throttle functionality must be enabled on the %throttle.", array("%createblock" => l(t("new block"), "admin/system/block/add"), "%throttle" => l(t("throttle configuration page"), "admin/system/modules/throttle")));
break;
case 'admin/system/block/add':
$output = t("Here you can create a custom content block. Once you have created this block you must make it active, and give it a place on the page using %overview. The title is used when displaying the block. The description is used in the \"block\" column on the %overview page. If you are going to place PHP code in the block, and you have <b>create php content</b> permission (see the %permission page) you <b>must</b> change the type to PHP to make your code active.", array("%overview" => l(t("blocks"), "admin/system/block"), "%permission" => l(t("permissions"), "admin/user/permission")));
......@@ -90,8 +90,8 @@ function block_block($op = "list", $delta = 0) {
function block_admin_save($edit) {
foreach ($edit as $module => $blocks) {
foreach ($blocks as $delta => $block) {
db_query("UPDATE {blocks} SET region = %d, status = %d, custom = %d, path = '%s', weight = %d WHERE module = '%s' AND delta = '%s'",
$block["region"], $block["status"], $block["custom"], $block["path"], $block["weight"], $module, $delta);
db_query("UPDATE {blocks} SET region = %d, status = %d, custom = %d, path = '%s', weight = %d, throttle = %d WHERE module = '%s' AND delta = '%s'",
$block["region"], $block["status"], $block["custom"], $block["path"], $block["weight"], $block["throttle"], $module, $delta);
}
}
......@@ -125,6 +125,7 @@ function _block_rehash($order_by = array("weight")) {
$block["region"] = $old_blocks[$module][$delta]->region;
$block["path"] = $old_blocks[$module][$delta]->path;
$block["custom"] = $old_blocks[$module][$delta]->custom;
$block["throttle"] = $old_blocks[$module][$delta]->throttle;
}
else {
$block["status"] = $block["weight"] = $block["region"] = $block["custom"] = 0;
......@@ -132,8 +133,8 @@ function _block_rehash($order_by = array("weight")) {
}
// reinsert blocks into table
db_query("INSERT INTO {blocks} (module, delta, status, weight, region, path, custom) VALUES ('%s', '%s', %d, %d, %d, '%s', %d)",
$block["module"], $block["delta"], $block["status"], $block["weight"], $block["region"], $block["path"], $block["custom"]);
db_query("INSERT INTO {blocks} (module, delta, status, weight, region, path, custom, throttle) VALUES ('%s', '%s', %d, %d, %d, '%s', %d, %d)",
$block["module"], $block["delta"], $block["status"], $block["weight"], $block["region"], $block["path"], $block["custom"], $block["throttle"]);
$blocks[] = $block;
......@@ -153,7 +154,7 @@ function block_admin_display() {
$blocks = _block_rehash();
$header = array(t("block"), t("enabled"), t("custom"), t("weight"), t("region"), t("path"), array("data" => t("operations"), "colspan" => 2));
$header = array(t("block"), t("enabled"), t("custom"), t("throttle"), t("weight"), t("region"), t("path"), array("data" => t("operations"), "colspan" => 2));
foreach ($blocks as $block) {
if ($block["module"] == "block") {
......@@ -165,7 +166,10 @@ function block_admin_display() {
$delete = "";
}
$rows[] = array($block["info"], array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][status", 1, $block["status"]), "align" => "center"), array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][custom", 1, $block["custom"]), "align" => "center"), form_weight(NULL, $block["module"]."][".$block["delta"]."][weight", $block["weight"]), form_radios(NULL, $block["module"]."][".$block["delta"]."][region", $block["region"], array(t("left"), t("right"))), form_textfield(NULL, $block["module"]."][".$block["delta"]."][path", $block["path"], 10, 255), $edit, $delete);
$rows[] = array($block["info"], array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][status", 1, $block["status"]), "align" => "center"), array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][custom", 1, $block["custom"]), "align" => "center"),
array("data" => form_checkbox(NULL, $block["module"]."][".$block["delta"]."][throttle", 1, $block["throttle"], NULL, variable_get("statistics_enable_auto_throttle", 0) ? NULL : array("disabled" => "disabled")), "align" => "center"),
form_weight(NULL, $block["module"]."][".$block["delta"]."][weight", $block["weight"]), form_radios(NULL, $block["module"]."][".$block["delta"]."][region", $block["region"], array(t("left"), t("right"))), form_textfield(NULL, $block["module"]."][".$block["delta"]."][path", $block["path"], 10, 255),
$edit, $delete);
}
$output = theme("table", $header, $rows);
......@@ -373,7 +377,17 @@ function block_list($region) {
while ($result && ($block = db_fetch_array($result))) {
if ((($block['status'] && (!$user->uid || !$block['custom'])) || ($block['custom'] && $user->block[$block['module']][$block['delta']])) && (!$block['path'] || preg_match($block['path'], str_replace("?q=", "", request_uri())))) {
$block = array_merge($block, module_invoke($block['module'], 'block', 'view', $block['delta']));
/*
** If congestion control is enabled, check current throttle status
** and see if block should be displayed based on server load.
*/
if ((module_invoke("throttle", "status") < 5) && $block['throttle'] && variable_get("statistics_enable_auto_throttle", 0)) {
$block['content'] = t('This block has been temporarily disabled as we are currently experiencing excessive load on our webserver. The block will be automatically reenabled when the webserver is less busy.');
}
else {
$block = array_merge($block, module_invoke($block['module'], 'block', 'view', $block['delta']));
}
if ($block['content']) {
$blocks[$region]["$block[module]_$block[delta]"] = (object) $block;
}
......
......@@ -33,7 +33,7 @@ function forum_settings() {
$group = form_select(t("Forum vocabulary"), "forum_nav_vocabulary", variable_get("forum_nav_vocabulary", ""), $vocs, t("The taxonomy vocabulary that will be used as the navigation tree. The vacabulary's terms define the forums."));
$group .= _taxonomy_term_select(t("Containers"), "forum_containers", variable_get("forum_containers", array()), variable_get("forum_nav_vocabulary", ""), t("You can choose forums which will not have topics, but will be just containers for other forums. This lets you both group and nest forums."), 1, t("<none>"));
$output = form_group(t("Forum structure"), $group);
$output = form_group(t('Forum structure settings'), $group);
$group = form_textarea(t("Explanation or submission guidelines"), "forum_help", variable_get("forum_help", ""), 70, 5, t("This text will be displayed at the top of the forum submission form. Useful for helping or instructing your users."));
$group .= form_textfield(t("Forum icon path"), "forum_icon_path", variable_get("forum_icon_path", ""), 30, 255, t("The path to the forum icons. Leave blank to disable icons. Don't add a trailing slash. Default icons are available in the 'misc' directory."));
......@@ -43,10 +43,10 @@ function forum_settings() {
$group .= form_select(t("Topics per page"), "forum_per_page", variable_get("forum_per_page", 25), $number, t("The default number of topics displayed per page; links to browse older messages are automatically being displayed."));
$forder = array(1 => t("Date - newest first"), 2 => t("Date - oldest first"), 3 => t("Posts - most active first"), 4=> t("Posts - least active first"));
$group .= form_radios(t("Default order"), "forum_order", variable_get("forum_order", "1"), $forder, t("The default display order for topics."));
$output .= form_group(t("Forum viewing options"), $group);
$output .= form_group(t('Forum viewing options'), $group);
$group = form_textfield(t("Number of topics in block"), "forum_block_num", variable_get("forum_block_num", "5"), 5, 5, t("The number of topics to show in the \"Forum topics\" block. To enable the block, click ". l("here", "admin/system/block") ."."));
$output .= form_group(t('"Forum topic" block'), $group);
$output .= form_group(t('"Forum topic" block settings'), $group);
}
}
......
......@@ -33,7 +33,7 @@ function forum_settings() {
$group = form_select(t("Forum vocabulary"), "forum_nav_vocabulary", variable_get("forum_nav_vocabulary", ""), $vocs, t("The taxonomy vocabulary that will be used as the navigation tree. The vacabulary's terms define the forums."));
$group .= _taxonomy_term_select(t("Containers"), "forum_containers", variable_get("forum_containers", array()), variable_get("forum_nav_vocabulary", ""), t("You can choose forums which will not have topics, but will be just containers for other forums. This lets you both group and nest forums."), 1, t("<none>"));
$output = form_group(t("Forum structure"), $group);
$output = form_group(t('Forum structure settings'), $group);
$group = form_textarea(t("Explanation or submission guidelines"), "forum_help", variable_get("forum_help", ""), 70, 5, t("This text will be displayed at the top of the forum submission form. Useful for helping or instructing your users."));
$group .= form_textfield(t("Forum icon path"), "forum_icon_path", variable_get("forum_icon_path", ""), 30, 255, t("The path to the forum icons. Leave blank to disable icons. Don't add a trailing slash. Default icons are available in the 'misc' directory."));
......@@ -43,10 +43,10 @@ function forum_settings() {
$group .= form_select(t("Topics per page"), "forum_per_page", variable_get("forum_per_page", 25), $number, t("The default number of topics displayed per page; links to browse older messages are automatically being displayed."));
$forder = array(1 => t("Date - newest first"), 2 => t("Date - oldest first"), 3 => t("Posts - most active first"), 4=> t("Posts - least active first"));
$group .= form_radios(t("Default order"), "forum_order", variable_get("forum_order", "1"), $forder, t("The default display order for topics."));
$output .= form_group(t("Forum viewing options"), $group);
$output .= form_group(t('Forum viewing options'), $group);
$group = form_textfield(t("Number of topics in block"), "forum_block_num", variable_get("forum_block_num", "5"), 5, 5, t("The number of topics to show in the \"Forum topics\" block. To enable the block, click ". l("here", "admin/system/block") ."."));
$output .= form_group(t('"Forum topic" block'), $group);
$output .= form_group(t('"Forum topic" block settings'), $group);
}
}
......
......@@ -383,52 +383,39 @@ function user_block($op = "list", $delta = 0) {
}
case 3:
if (user_access("access content")) {
/* utilize auto-throttle to disable when this site is too busy */
if (function_exists("throttle_status"))
$throttle = throttle_status();
else
$throttle = 0;
/* be sure the site isn't too busy prior to performing db queries */
if ($throttle < 5) {
/* count users with activity in the past defined period */
$time_period = variable_get("user_block_seconds_online", 2700);
/* perform database queries to gather online user lists */
$guests = db_fetch_object(db_query("SELECT COUNT(DISTINCT sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0", time() - $time_period));
$users = db_query("SELECT DISTINCT uid, MAX(timestamp) AS max_timestamp FROM {sessions} WHERE timestamp >= %d AND uid != 0 GROUP BY uid ORDER BY max_timestamp DESC", time() - $time_period );
$total_users = db_affected_rows();
/* format the output with proper grammar */
if ($total_users == 1 && $guests->count == 1) {
$output = t("There is currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
else {
$output = t("There are currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
/* count users with activity in the past defined period */
$time_period = variable_get("user_block_seconds_online", 2700);
if (user_access("access user list") && $total_users) {
/* Display a list of currently online users */
$max_users = variable_get("user_block_max_list_count", 10);
$items = array();
while ($uid = db_fetch_object($users)) {
$items[] = format_name(user_load(array("uid" => $uid->uid)));
}
if ($items) {
$output .= "<br /><br />";
$output .= theme("item_list", $items, t("Online users:"));
}
}
/* perform database queries to gather online user lists */
$guests = db_fetch_object(db_query("SELECT COUNT(DISTINCT sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0", time() - $time_period));
$users = db_query("SELECT DISTINCT uid, MAX(timestamp) AS max_timestamp FROM {sessions} WHERE timestamp >= %d AND uid != 0 GROUP BY uid ORDER BY max_timestamp DESC", time() - $time_period );
$total_users = db_affected_rows();
/* format the output with proper grammar */
if ($total_users == 1 && $guests->count == 1) {
$output = t("There is currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
else {
/* the site is too busy -- display a simple "too busy" message */
$output = t("This site is currently sustaining more than %total page views a minute.", array("%total" => ($throttle * variable_get("statistics_throttle_multiplier", 60))));
$output = t("There are currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
if (user_access("access user list") && $total_users) {
/* Display a list of currently online users */
$max_users = variable_get("user_block_max_list_count", 10);
$items = array();
while ($uid = db_fetch_object($users)) {
$items[] = format_name(user_load(array("uid" => $uid->uid)));
}
if ($items) {
$output .= "<br /><br />";
$output .= theme("item_list", $items, t("Online users:"));
}
}
$block["subject"] = t("Who's online");
$block["content"] = $output;
return $block;
}
$block["subject"] = t("Who's online");
$block["content"] = $output;
return $block;
}
}
}
......
......@@ -383,52 +383,39 @@ function user_block($op = "list", $delta = 0) {
}
case 3:
if (user_access("access content")) {
/* utilize auto-throttle to disable when this site is too busy */
if (function_exists("throttle_status"))
$throttle = throttle_status();
else
$throttle = 0;
/* be sure the site isn't too busy prior to performing db queries */
if ($throttle < 5) {
/* count users with activity in the past defined period */
$time_period = variable_get("user_block_seconds_online", 2700);
/* perform database queries to gather online user lists */
$guests = db_fetch_object(db_query("SELECT COUNT(DISTINCT sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0", time() - $time_period));
$users = db_query("SELECT DISTINCT uid, MAX(timestamp) AS max_timestamp FROM {sessions} WHERE timestamp >= %d AND uid != 0 GROUP BY uid ORDER BY max_timestamp DESC", time() - $time_period );
$total_users = db_affected_rows();
/* format the output with proper grammar */
if ($total_users == 1 && $guests->count == 1) {
$output = t("There is currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
else {
$output = t("There are currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
/* count users with activity in the past defined period */
$time_period = variable_get("user_block_seconds_online", 2700);
if (user_access("access user list") && $total_users) {
/* Display a list of currently online users */
$max_users = variable_get("user_block_max_list_count", 10);
$items = array();
while ($uid = db_fetch_object($users)) {
$items[] = format_name(user_load(array("uid" => $uid->uid)));
}
if ($items) {
$output .= "<br /><br />";
$output .= theme("item_list", $items, t("Online users:"));
}
}
/* perform database queries to gather online user lists */
$guests = db_fetch_object(db_query("SELECT COUNT(DISTINCT sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0", time() - $time_period));
$users = db_query("SELECT DISTINCT uid, MAX(timestamp) AS max_timestamp FROM {sessions} WHERE timestamp >= %d AND uid != 0 GROUP BY uid ORDER BY max_timestamp DESC", time() - $time_period );
$total_users = db_affected_rows();
/* format the output with proper grammar */
if ($total_users == 1 && $guests->count == 1) {
$output = t("There is currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
else {
/* the site is too busy -- display a simple "too busy" message */
$output = t("This site is currently sustaining more than %total page views a minute.", array("%total" => ($throttle * variable_get("statistics_throttle_multiplier", 60))));
$output = t("There are currently %members and %visitors online.", array("%members" => format_plural($total_users, "1 user", "%count users"), "%visitors" => format_plural($guests->count, "1 guest", "%count guests")));
}
if (user_access("access user list") && $total_users) {
/* Display a list of currently online users */
$max_users = variable_get("user_block_max_list_count", 10);
$items = array();
while ($uid = db_fetch_object($users)) {
$items[] = format_name(user_load(array("uid" => $uid->uid)));
}
if ($items) {
$output .= "<br /><br />";
$output .= theme("item_list", $items, t("Online users:"));
}
}
$block["subject"] = t("Who's online");
$block["content"] = $output;
return $block;
}
$block["subject"] = t("Who's online");
$block["content"] = $output;
return $block;
}
}
}
......
......@@ -60,7 +60,8 @@
"2003-10-20" => "update_68",
"2003-10-22" => "update_69",
"2003-10-27" => "update_70",
"2003-11-17" => "update_71"
"2003-11-17" => "update_71",
"2003-11-27" => "update_72"
);
function update_32() {
......@@ -552,6 +553,10 @@ function update_71() {
update_sql("ALTER TABLE {system} ADD bootstrap int(2)");
}
function update_72() {
update_sql("ALTER TABLE {blocks} ADD throttle tinyint(1) NOT NULL DEFAULT '0'");
}
/*
** System functions
*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment