Перевел сайт к другому хостеру, у которого стоит ограничение на количество запросов к mysql. Разумеется, в считанные часы база "свалилась", а я запрягся смотреть, что же это такое генерит избыточные запросы.
В числе всего прочего самый главный виновник -- вот этот самый reputation mod. Например, для просмотра одной страницы форума он делает около 50 запросов к базе. Прониклись немного? :)
Пришлось срочно все кешировать, результат представлен ниже.
Несколько пояснений: кешировано очень неоптимально, я просто врапил sql запросы и все. Для того, чтобы это сделать умнее, пришлось бы менять внутреннюю логику мода, чего мне не хотелось бы (все еще наивно надеюсь, что автор модифицирует свое детище). :) В итоге количество запросов к базе за счет кеширования уменьшилось весьма и весьма, однако я уже по коду видел, что за счет переделки структуры sql запросов, их еще больше можно было бы уменьшить. Сейчас у меня получается в кеше очень много маленьких файлов, а можно было бы уменьшить количество файлов, но они были бы несколько больше по размеру... В любом случае, уверен, с кешированием намного лучше, чем без него. Кстати, благодаря кешированию безболезненно теперь могу разрешить анонимусам видеть репутацию пользователей сайта.
Теперь немного о том, что именно должно предшествовать настройке кеширования, что должно быть установлено, чтобы был гарантированный результат:
Собственно, сам reputation mod 0.1.5 dev
(логично, не правда ли? ;))Фиксы всяких мелких багов от автора мода
(т.к. я предлагаю файл reputation.php полностью заменить на свой, то, по идее, этим пунктом заморачиваться не стоит, все уже "включено в сервис")Аддон для показа количества репутации в конкретном посте
мои
обновления для этого аддона
Поехали.
файл
reputation.php, заменяйте целиком:
<?php
/**
*
* @package phpBB3
* @version $Id: reputation.php,v 0.1.5 2009/01/03 15:07:00 OlegNT Exp $
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
* Minimum Requirement: PHP 4.3.3
*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup('mods/reputation');
$mode = request_var('mode', 'view', 'reviews');
if (!in_array($mode, array('view', 'change', 'reviews')))
{
trigger_error('NO_MODE');
}
if ($mode == 'view')
{
$user_id = request_var('u', $user->data['user_id']);
if ($user_id == ANONYMOUS)
{
trigger_error('REPUTATION_NO_SUCH_USER');
}
$start = request_var('start', 0);
if ($start < 0)
{
$start = 0;
}
$cache_filename = '_rep_users_userid_' . $user_id;
if (($row = $cache->get($cache_filename)) === false)
{
$sql = "SELECT u.username, u.user_reputation_pluses, u.user_reputation_minuses, u.user_reputation_total, u.user_colour
FROM " . USERS_TABLE . " u
WHERE u.user_id = $user_id";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$cache->put($cache_filename, $row);
}
if (empty($row))
{
trigger_error('REPUTATION_NO_SUCH_USER');
}
$username = $row['username'];
$reputation_pluses = $row['user_reputation_pluses'];
$reputation_minuses = $row['user_reputation_minuses'];
$reputation_total = $row['user_reputation_total'];
$username_full = get_username_string('full', $user_id, $username, $row['user_colour']);
$page_title = $user->lang['REPUTATION'];
$cache_filename = '_rep_all_userid_perpage_start_' . $user_id . '_' . $config['topics_per_page'] . '_' . $start;
if (($reprows = $cache->get($cache_filename)) === false)
{
$sql = "SELECT r.*
FROM " . REPUTATION_TABLE . " r
WHERE r.reputation_to = $user_id
ORDER BY r.reputation_time DESC";
$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
$reprows = array();
while ($row = $db->sql_fetchrow($result))
{
$reprows[] = $row;
}
$db->sql_freeresult($result);
$cache->put($cache_filename, $reprows);
}
$users_cache = array();
$topics_cache = array();
$i = 0;
foreach ($reprows as $reprows_key => $reprows_value)
{
$r_userid = $reprows_value['reputation_from'];
$r_comment = nl2br(trim($reprows_value['reputation_comment']));
$r_post = $reprows_value['reputation_post'];
$r_time = $user->format_date($reprows_value['reputation_time']);
$r_type = $reprows_value['reputation_type'];
$r_image_type = ($r_type) ? $user->img('icon_reputation_up', '+') : $user->img('icon_reputation_down', '−');
$cache_filename = '_rep_usercolor_userid_' . $r_userid;
if (($row = $cache->get($cache_filename)) === false)
{
$sql = "SELECT u.username, u.user_colour
FROM " . USERS_TABLE . " u
WHERE u.user_id = $r_userid";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$cache->put($cache_filename, $row);
}
$r_username = get_username_string('full', $r_userid, $row['username'], $row['user_colour']);
if (!isset($topics_cache[$r_post]))
{
$cache_filename = '_rep_topictitle_post_' . $r_post;
if (($topics_cache[$r_post] = $cache->get($cache_filename)) === false)
{
$sql = "SELECT t.topic_title
FROM " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p
WHERE p.post_id = $r_post
AND t.topic_id = p.topic_id";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$topics_cache[$r_post] = (empty($row['topic_title'])) ? false : $row['topic_title'];
$db->sql_freeresult($result);
$cache->put($cache_filename, $topics_cache[$r_post]);
}
}
if ($topics_cache[$r_post])
{
$r_topic = '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "p=$r_post") . '#p' . $r_post . '">' . $topics_cache[$r_post] . '</a>';
}
else
{
$r_topic = false;
}
$template->assign_block_vars('reputationrow', array(
'ROWID' => $i + ($start + 1),
'USERNAME' => $r_username,
'TOPIC' => $r_topic,
'COMMENT' => $r_comment,
'TYPE' => $r_image_type,
'TIME' => $r_time)
);
$i++;
}
$cache_filename = '_rep_cnt_touserid_' . $user_id;
if (($reputation_total_items = $cache->get($cache_filename)) === false)
{
$sql = "SELECT COUNT(*) AS rep_cnt
FROM " . REPUTATION_TABLE . "
WHERE reputation_to = $user_id";
$result = $db->sql_query($sql);
$reputation_total_items = $db->sql_fetchfield('rep_cnt');
$db->sql_freeresult($result);
$cache->put($cache_filename, $reputation_total_items);
}
$pagination = generate_pagination(append_sid("{$phpbb_root_path}reputation.$phpEx", "u=$user_id"), $reputation_total_items, $config['topics_per_page'], $start);
$on_page = on_page($reputation_total_items, $config['topics_per_page'], $start);
$template->assign_vars(array(
'USER_REPUTATION_INFO' => sprintf($user->lang['REPUTATION_HISTORY_TITLE'], $username_full) . ': <strong>' . (($reputation_total < 0) ? '−' . abs($reputation_total) : $reputation_total) . ' [ −' . $reputation_minuses . '/+' . $reputation_pluses . ' ]</strong>',
'PAGINATION' => $pagination,
'TOTAL_COMMENTS' => ($reputation_total_items == 1) ? $user->lang['REPUTATION_TOTAL_ONE_COMMENT'] : sprintf($user->lang['REPUTATION_TOTAL_COMMENTS'], $reputation_total_items),
'PAGE_NUMBER' => $on_page,
));
page_header($page_title);
$template->set_filenames(array(
'body' => 'reputation_history_body.html')
);
page_footer();
}
elseif ($mode == 'reviews')
{
$posts_id = request_var('p', $user->data['user_id']);
$start = request_var('start', 0);
if ($start < 0)
{
$start = 0;
}
$page_title = $user->lang['REPUTATION_FOR_POST'];
$cache_filename = '_rep_all_postid_perpage_start_' . $posts_id . '_' . $config['topics_per_page'] . '_' . $start;
if (($reprows = $cache->get($cache_filename)) === false)
{
$sql = "SELECT r.*
FROM " . REPUTATION_TABLE . " r
WHERE reputation_post= $posts_id
ORDER BY r.reputation_time DESC";
$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
$reprows = array();
while ($row = $db->sql_fetchrow($result))
{
$reprows[] = $row;
}
$db->sql_freeresult($result);
$cache->put($cache_filename, $reprows);
}
$users_cache = array();
$topic_rev = '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "p=$posts_id") . '#p' . $posts_id . '">' . $posts_id . '</a>';
$i = 0;
foreach ($reprows as $reprows_key => $reprows_value)
{
$r_userid = $reprows_value['reputation_from'];
$r_comment = nl2br(trim($reprows_value['reputation_comment']));
$r_time = $user->format_date($reprows_value['reputation_time']);
$r_type = $reprows_value['reputation_type'];
$r_image_type = ($r_type) ? $user->img('icon_reputation_up', '+') : $user->img('icon_reputation_down', '−');
$cache_filename = '_rep_usercolor_userid_' . $r_userid;
if (($row = $cache->get($cache_filename)) === false)
{
$sql = "SELECT u.username, u.user_colour
FROM " . USERS_TABLE . " u
WHERE u.user_id = $r_userid";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$cache->put($cache_filename, $row);
}
$r_username = get_username_string('full', $r_userid, $row['username'], $row['user_colour']);
$template->assign_block_vars('reputationrow', array(
'ROWID' => $i + ($start + 1),
'USERNAME' => $r_username,
'COMMENT' => $r_comment,
'TYPE' => $r_image_type,
'TIME' => $r_time)
);
$i++;
}
// unnecessary UNIONs,
// but should work together with Reviews addon to decrease count of sql requests and cache items
$cache_filename = '_rep_cnt_post_' . $posts_id;
if (($rep_count = $cache->get($cache_filename)) === false)
{
$sql = 'SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $posts_id . '
UNION ALL
SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $posts_id . ' AND reputation_type = 1
UNION ALL
SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $posts_id . ' AND reputation_type = 0';
$result = $db->sql_query($sql);
$rep_count = array();
while ($rep_row = $db->sql_fetchrow($result))
{
$rep_count[] = $rep_row['rep_cnt'];
}
$db->sql_freeresult($result);
$cache->put($cache_filename, $rep_count);
}
$reputation_total_items = $rep_count[0];
$pagination = generate_pagination(append_sid("{$phpbb_root_path}reputation.$phpEx", "mode=reviews&p=$posts_id"), $reputation_total_items, $config['topics_per_page'], $start);
$on_page = on_page($reputation_total_items, $config['topics_per_page'], $start);
$template->assign_vars(array(
'PAGINATION' => $pagination,
'TOTAL_COMMENTS' => ($reputation_total_items == 1) ? $user->lang['REPUTATION_TOTAL_ONE_COMMENT'] : sprintf($user->lang['REPUTATION_TOTAL_COMMENTS'], $reputation_total_items),
'PAGE_NUMBER' => $on_page,
'TOPIC' => $topic_rev
));
page_header($page_title);
$template->set_filenames(array(
'body' => 'reputation_topic_body.html')
);
page_footer();
}
else
{
if (!$user->data['is_registered'])
{
login_box('', 'Only registered users may change reputation');
}
$type = request_var('type', '');
if ( $type != 'plus' && $type != 'minus' )
{
trigger_error(sprintf($user->lang['REPUTATION_INVALID_VALUE'], 'type'));
}
if ($user->data['user_reputation_ban'])
{
trigger_error('REPUTATION_FORBIDDEN');
}
$post_id = request_var('p', 0);
if (!$post_id)
{
trigger_error('REPUTATION_POST_NOT_FOUND');
}
$cache_filename = '_rep_postsusers_postid_' . $post_id;
if (($row = $cache->get($cache_filename)) === false)
{
$sql = "SELECT p.poster_id, u.username, u.user_reputation_minuses, u.user_reputation_pluses, u.user_reputation_total, u.user_reputation_ban, u.user_colour
FROM " . POSTS_TABLE . " p, " . USERS_TABLE . " u
WHERE p.post_id = $post_id
AND u.user_id = p.poster_id";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$cache->put($cache_filename, $row);
}
if (empty($row))
{
trigger_error('REPUTATION_POST_NOT_FOUND');
}
$poster_id = $row['poster_id'];
$to_username = $row['username'];
$reputation_pluses = $row['user_reputation_pluses'];
$reputation_minuses = $row['user_reputation_minuses'];
$reputation_total = $row['user_reputation_total'];
$poster_full = get_username_string('full', $poster_id, $to_username, $row['user_colour']);
$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "p=$post_id") . "#p$post_id";
if ($poster_id == $user->data['user_id'])
{
trigger_error(sprintf($user->lang['REPUTATION_SELF'], $redirect_url));
}
if ($config['reputation_max_comments'])
{
$cache_filename = '_rep_posterid_max_' . $poster_id . '_' . $config['topics_per_page'];
if (($rows = $cache->get($cache_filename)) === false)
{
$sql = "SELECT r.reputation_id, r.reputation_from
FROM " . REPUTATION_TABLE . " r
WHERE r.reputation_to = $poster_id
ORDER BY r.reputation_time DESC
LIMIT 0, " . $config['reputation_max_comments'];
$result = $db->sql_query($sql);
$rows = array();
while ($row = $db->sql_fetchrow($result))
{
$rows[] = $row;
}
$db->sql_freeresult($result);
$cache->put($cache_filename, $rows);
}
if ($config['reputation_max_comments'] == sizeof($rows))
{
$forbid = true;
foreach ($rows as $rows_key => $rows_value)
{
if ($rows_value['reputation_from'] != $user->data['user_id'])
{
$forbid = false;
break;
}
}
}
else
{
$forbid = false;
}
if ($forbid)
{
trigger_error('REPUTATION_LIMIT_COMMENTS');
}
}
$cache_filename = '_rep_cnt_poster_from_post_' . $poster_id . '_' . $user->data['user_id'] . '_' . $post_id;
if (($_c = $cache->get($cache_filename)) === false)
{
$sql = "SELECT COUNT(*) AS cnt
FROM " . REPUTATION_TABLE . " r
WHERE r.reputation_to = $poster_id
AND r.reputation_from = " . $user->data['user_id'] . "
AND r.reputation_post = $post_id";
$result = $db->sql_query($sql);
$_c = $db->sql_fetchfield('cnt');
$db->sql_freeresult($result);
$cache->put($cache_filename, $_c);
}
if ($_c)
{
trigger_error(sprintf($user->lang['REPUTATION_AGAIN'], $redirect_url));
}
$error = false;
$rep_post = request_var('rep-post', '0');
$comment = utf8_normalize_nfc(request_var('comment', '', true));
if (!empty($rep_post))
{
if (empty($comment))
{
$error = true;
}
else
{
if ($type == 'minus')
{
$sql_rep_change = 'user_reputation_minuses = user_reputation_minuses + 1';
$sql_rep_change_total = 'user_reputation_total = user_reputation_total - 1';
}
else
{
$sql_rep_change = 'user_reputation_pluses = user_reputation_pluses + 1';
$sql_rep_change_total = 'user_reputation_total = user_reputation_total + 1';
}
$sql = "UPDATE " . USERS_TABLE . "
SET $sql_rep_change, $sql_rep_change_total
WHERE user_id = $poster_id";
$db->sql_query($sql);
// empty outdated cache items
$cache->destroy('_rep_users_userid_' . $poster_id);
$cache->destroy('_rep_postsusers_postid_' . $post_id);
// not sure that we need to destroy this cache item right here
// but anyway we need to refresh it somewhere,
// and I'm too lazy to find "change user group or color" actions in the source code ;)
$cache->destroy('_rep_usercolor_userid_' . $poster_id);
$sql = "INSERT INTO " . REPUTATION_TABLE . " (reputation_to, reputation_from, reputation_comment, reputation_time, reputation_type, reputation_post, reputation_read)
VALUES ($poster_id, " . $user->data['user_id'] . ", '" . $db->sql_escape($comment) . "', " . time() . ", " . (($type == 'plus') ? 1 : 0 ) . ", $post_id, 0)";
$db->sql_query($sql);
// empty outdated cache items
$cache->destroy('_rep_cnt_poster_from_post_' . $poster_id . '_' . $user->data['user_id'] . '_' . $post_id);
$cache->destroy('_rep_idfrom_poster_maxcomments_' . $poster_id . '_' . $config['reputation_max_comments']);
$cache->destroy('_rep_cnt_post_' . $post_id);
$cache->destroy('_rep_topictitle_post_' . $post_id);
$cache->destroy('_rep_cnt_touserid_' . $poster_id);
$cache->destroy('_rep_posterid_max_' . $poster_id . '_' . $config['topics_per_page']);
// ugly hardcode, I know. Kick me. ;)
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . 0);
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 1));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 2));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 3));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 4));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 5));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 6));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 7));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 8));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 9));
$cache->destroy('_rep_all_postid_perpage_start_' . $post_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 10));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . 0);
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 1));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 2));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 3));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 4));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 5));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 6));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 7));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 8));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 9));
$cache->destroy('_rep_all_userid_perpage_start_' . $poster_id . '_' . $config['topics_per_page'] . '_' . ($config['topics_per_page'] * 10));
meta_refresh(3, $redirect_url);
trigger_error(sprintf($user->lang['REPUTATION_CHANGED'], $redirect_url));
}
}
add_form_key('reputation_change');
$page_title = $user->lang['REPUTATION_CHANGING'];
page_header($page_title);
$s_hidden_fields = '<input type="hidden" name="mode" value="change" />';
$s_hidden_fields .= '<input type="hidden" name="type" value="' . $type . '" />';
$s_hidden_fields .= '<input type="hidden" name="p" value="' . $post_id . '" />';
$s_hidden_fields .= '<input type="hidden" name="rep-post" value="1" />';
if ($error)
{
$template->assign_vars(array(
'ERROR' => $user->lang['REPUTATION_MISSING_COMMENT'])
);
}
$template->assign_vars(array(
'S_REPUTATION_ACTION' => append_sid("{$phpbb_root_path}reputation.$phpEx"),
'S_HIDDEN_FIELDS' => $s_hidden_fields,
'USERNAME' => $poster_full,
'U_USER_REPUTATION' => append_sid("{$phpbb_root_path}reputation.$phpEx", "u=$poster_id"),
'REPUTATION_VALUE' => ($reputation_total < 0) ? '−' . abs($reputation_total) : $reputation_total,
'REPUTATION_PLUSES' => $reputation_pluses,
'REPUTATION_MINUSES' => $reputation_minuses,
'S_REPUTATION_TYPE' => $type,
'U_FOR_POST' => $redirect_url,
'COMMENT' => $comment,
));
$template->set_filenames(array(
'body' => 'reputation_change_body.html')
);
page_footer();
}
?>
Файл
memberlist.php:
После:
$ranks = $cache->obtain_ranks();
Вставить:
// Reputation START
// Kot: Moved to global scope
$user->add_lang(array('mods/reputation'));
// Reputation END
Заменить:
// Reputation START
$user->add_lang(array('mods/reputation'));На:
Файл
viewtopic.phpЗаменить:
$sql = 'SELECT COUNT(*) AS reputation_cnt
FROM ' . REPUTATION_TABLE . " r
WHERE r.reputation_to = $poster_id
AND r.reputation_from = " . $user->data['user_id'] . '
AND r.reputation_post = ' . $row['post_id'];
$result = $db->sql_query($sql);
$rep_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$reputation_changeable = !$rep_row['reputation_cnt'];
На:
$cache_filename = '_rep_cnt_poster_from_post_' . $poster_id . '_' . $user->data['user_id'] . '_' . $row['post_id'];
if (($rep_row = $cache->get($cache_filename)) === false)
{
$sql = 'SELECT COUNT(*) AS reputation_cnt
FROM ' . REPUTATION_TABLE . " r
WHERE r.reputation_to = $poster_id
AND r.reputation_from = " . $user->data['user_id'] . '
AND r.reputation_post = ' . $row['post_id'];
$result = $db->sql_query($sql);
$rep_row = $db->sql_fetchfield('reputation_cnt');
$db->sql_freeresult($result);
$cache->put($cache_filename, $rep_row);
}
$reputation_changeable = !$rep_row;Заменить:
$sql = 'SELECT r.reputation_id, r.reputation_from
FROM ' . REPUTATION_TABLE . " r
WHERE r.reputation_to = $poster_id
ORDER BY r.reputation_time DESC
LIMIT 0, " . $config['reputation_max_comments'];
$result = $db->sql_query($sql);
$rep_rows = array();
while ($rep_row = $db->sql_fetchrow($result))
{
$rep_rows[] = $rep_row;
}
$db->sql_freeresult($result);
На:
$cache_filename = '_rep_idfrom_poster_maxcomments_' . $poster_id . '_' . $config['reputation_max_comments'];
if (($rep_rows = $cache->get($cache_filename)) === false)
{
$sql = 'SELECT r.reputation_id, r.reputation_from
FROM ' . REPUTATION_TABLE . " r
WHERE r.reputation_to = $poster_id
ORDER BY r.reputation_time DESC
LIMIT 0, " . $config['reputation_max_comments'];
$result = $db->sql_query($sql);
$rep_rows = array();
while ($rep_row = $db->sql_fetchrow($result))
{
$rep_rows[] = $rep_row;
}
$db->sql_freeresult($result);
$cache->put($cache_filename, $rep_rows);
}
Заменить:
// Review
if ($user->data['user_id'] == ANONYMOUS && !$user->data['is_bot'])
На:
// Review
if ($user->data['is_bot'])
Заменить:
$sql = 'SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $row['post_id'] . '
UNION ALL
SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $row['post_id'] . ' AND reputation_type = 1
UNION ALL
SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $row['post_id'] . ' AND reputation_type = 0';
$result = $db->sql_query($sql);
$reviews_total_items = $db->sql_fetchfield('rep_cnt', 0);
if ( $reviews_total_items > 0 )
{
$reviews_plus_items = $db->sql_fetchfield('rep_cnt', 1);
$reviews_minus_items = $db->sql_fetchfield('rep_cnt', 2);
$reviews_diff = $reviews_plus_items - $reviews_minus_items;
$reviews = $user->lang['REVIEWS_MESSAGE_RATING'] . ': <strong class=' . ($reviews_diff > 0 ? '"positive">+' : '"negative">') . $reviews_diff . '</strong> (<a href="' . append_sid("{$phpbb_root_path}reputation.$phpEx", "mode=reviews&p=" . $row['post_id']) . '" title="' . $user->lang['REVIEWS_HISTORY'] . '">' . $user->lang['REVIEWS'] . ": $reviews_total_items</a>)";
}
else
{
$reviews = '';
}
$db->sql_freeresult($result);
}На:
$cache_filename = '_rep_cnt_post_' . $row['post_id'];
if (($rep_count = $cache->get($cache_filename)) === false)
{
$sql = 'SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $row['post_id'] . '
UNION ALL
SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $row['post_id'] . ' AND reputation_type = 1
UNION ALL
SELECT COUNT(*) as rep_cnt
FROM ' . REPUTATION_TABLE . '
WHERE reputation_post =' . $row['post_id'] . ' AND reputation_type = 0';
$result = $db->sql_query($sql);
$rep_count = array();
while ($rep_row = $db->sql_fetchrow($result))
{
$rep_count[] = $rep_row['rep_cnt'];
}
$db->sql_freeresult($result);
$cache->put($cache_filename, $rep_count);
}
$reviews_total_items = $rep_count[0];
if ( $reviews_total_items > 0 )
{
$reviews_plus_items = $rep_count[1];
$reviews_minus_items = $rep_count[2];
$reviews_diff = $reviews_plus_items - $reviews_minus_items;
$reviews = $user->lang['REVIEWS_MESSAGE_RATING'] . ': <strong class=' . ($reviews_diff > 0 ? '"positive">+' : '"negative">') . $reviews_diff . '</strong> (<a href="' . append_sid("{$phpbb_root_path}reputation.$phpEx", "mode=reviews&p=" . $row['post_id']) . '" title="' . $user->lang['REVIEWS_HISTORY'] . '">' . $user->lang['REVIEWS'] . ": $reviews_total_items</a>)";
}
else
{
$reviews = '';
}
}