Быстрый лёгкий надёжный форумный движок
Вы не вошли.
конечно пробовал. только я в конфиг это добавляю. сначала PUN_DEBUG, а за ним PUN_SHOW_QUERIES
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
artoodetoo, я уже разобрался - не на том сервере правил файлы
Теперь другая проблема вылезла.
Оказывается, с выходом версии PHP 5.3.0 некоторые функции были признаны устаревшими и были заменены на другие.
И PHP начал ругаться на
eregi('^(www\.)?(.*)$', $_SERVER['HTTP_HOST'], $regs);
таким образом
PHP Deprecated: Function eregi() is deprecated in
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Заменил так
// eregi('^(https?\://)(www\.)?(.*)$', $pun_config['o_base_url'], $regs);
preg_match('/^(https?\:\/\/)(www\.)?(.*)$/i', $pun_config['o_base_url'], $regs);
...
// eregi('^(www\.)?(.*)$', $_SERVER['HTTP_HOST'], $regs);
preg_match('/^(www\.)?(.*)$/i', $_SERVER['HTTP_HOST'], $regs);
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
В просмотре темы есть такой запрос к базе
SELECT u.warning_all, u.email, u.title, u.gender, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.messages_enable, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, p.edit_post, g.g_id, g.g_user_title, g.g_pm, o.user_id AS is_online FROM _posts AS p INNER JOIN _users AS u ON u.id=p.poster_id INNER JOIN _groups AS g ON g.g_id=u.group_id LEFT JOIN _online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.id IN (...) ORDER BY p.id
Что нам даст удаление от сюда запроса к таблице online? Я имею в виду - в плане скорости.
Просто данные по online можно формировать из другого выполняемого запроса и не только тут.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Вероятно ничего не даст. Но это следует подтвердить экспериментально.
Из какого другого запроса ты сформируешь данные on-line об отписавшихся в теме?
Offline
hcs, в моей сборке изменена ф-ия update_users_online(), которая, если не ошибаюсь, выполняется в каждом открытии страниц форума.
Запрос в ней
$result = $db->query('SELECT * FROM '.$db->prefix.'online') or error('Unable to fetch old entries from online list', __FILE__, __LINE__, $db->error());
нужно заменить на
$result = $db->query('SELECT * FROM '.$db->prefix.'online ORDER BY ident') or error('Unable to fetch old entries from online list', __FILE__, __LINE__, $db->error());
Тогда можно формировать массив онлайн юзеров и его использовать:
1. В просмотре тем - убирается часть запроса к таблице онлайн.
2. На главной - убирается один запрос к базе.
3. В поиске - в некоторых запросах убирается один запрос к базе.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Ну тогда это хороший вариант
Offline
хорошо бы замеры скорости. меня смущает, что online уже "закеширован" - его тип хранения MEMORY (синоним HEAP).
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
artoodetoo, как это сделать объективно?
У меня например при одном и том же открытии страницы бывают гиганские скачки в выполнении.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
усредненно на множестве прогонов.
apache ab
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
Сделал маленький тест на тестовом форуме (который в инете) пробежав все страницы тем по 2 раза.
1.
SELECT u.warning_all, u.email, u.title, u.gender, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.messages_enable, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, p.edit_post, p.user_agent, g.g_id, g.g_user_title, g.g_pm, o.user_id AS is_online FROM flux_posts AS p INNER JOIN flux_users AS u ON u.id=p.poster_id INNER JOIN flux_groups AS g ON g.g_id=u.group_id LEFT JOIN flux_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.id IN (...) ORDER BY p.id
Результат запроса в сек.:
0.00513 0.00510
0.00487 0.00479
0.00410 0.00739
0.00488 0.00606
0.00050 0.00061
0.00427 0.00425
0.00587 0.00506
0.00263 0.00544
0.00412 0.00438
2.
SELECT u.warning_all, u.email, u.title, u.gender, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.messages_enable, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, p.edit_post, p.user_agent, g.g_id, g.g_user_title, g.g_pm, 0 AS is_online FROM flux_posts AS p INNER JOIN flux_users AS u ON u.id=p.poster_id INNER JOIN flux_groups AS g ON g.g_id=u.group_id WHERE p.id IN (...) ORDER BY p.id
Результат запроса в сек.:
0.00118 0.00068
0.00081 0.00053
0.00054 0.00031
0.00154 0.00078
0.00050 0.00038
0.00083 0.00041
0.00116 0.00063
0.00059 0.00027
0.00054 0.00035
В обоих случаях на форуме я был один.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
круто
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Offline
В общем поставил себе на основной форум изменение с онлайн пользователями на index.php и viewtopic.php.
На глаз по [ Сгенерировано за 0.019 сек, 10 запросов выполнено - Использовано памяти: 2.88 MB (Пик: 3.05 MB) ] изменений не осущается, в том числе из-за генерации массивов онлайн пользователей в PHP.
По таблице запросов к базе, запросы представленные выше показывают выигрышь.
Так что не знаю, включать это изменение в сборку или нет!?
Надо бы на простых серверах потестить, а не навыделенном.
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
В общем так:
Ф-ия update_users_online():
//
// Update "Users online"
// ф-ия переписана для определения пика посещаемости форума - Visman
function update_users_online()
{
global $db, $pun_config, $online_users, $online_guests, $online_search;
$now = time();
$kol = 0;
$flag = false;
// Fetch all online list entries that are older than "o_timeout_online"
$result = $db->query('SELECT * FROM '.$db->prefix.'online') or error('Unable to fetch old entries from online list', __FILE__, __LINE__, $db->error());
while ($cur_user = $db->fetch_assoc($result))
{
if ($cur_user['logged'] < ($now-$pun_config['o_timeout_online']))
{
// If the entry is a guest, delete it
if ($cur_user['user_id'] == '1')
$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($cur_user['ident']).'\'') or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
else
{
// If the entry is older than "o_timeout_visit", update last_visit for the user in question, then delete him/her from the online list
if ($cur_user['logged'] < ($now-$pun_config['o_timeout_visit']))
{
$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$cur_user['logged'].' WHERE id='.$cur_user['user_id']) or error('Unable to update user visit data', __FILE__, __LINE__, $db->error());
$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$cur_user['user_id']) or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
}
else if ($cur_user['idle'] == '0')
{
$db->query('UPDATE '.$db->prefix.'online SET idle=1 WHERE user_id='.$cur_user['user_id']) or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
$online_search.= ',\''.$db->escape($cur_user['ident']).'\'';
}
}
}
else
{
$kol++;
$online_search.= ',\''.$db->escape($cur_user['ident']).'\'';
if ($cur_user['user_id'] == '1')
$online_guests[] = $cur_user['ident'];
else
$online_users[$cur_user['user_id']] = $cur_user['ident'];
}
}
@include FORUM_CACHE_DIR.'cache_maxusers.php';
if (!defined('PUN_MAXUSERS_LOADED'))
$flag = true;
else if ($stats['max_users'] < $kol )
$flag = true;
if ($flag)
{
$fh = @fopen(FORUM_CACHE_DIR.'cache_maxusers.php', 'wb');
if (!$fh)
error('Unable to write configuration cache file to cache directory. Please make sure PHP has write access to the directory \'cache\'', __FILE__, __LINE__);
fwrite($fh, '<?php'."\n\n".'define(\'PUN_MAXUSERS_LOADED\', 1)'.";\n");
fwrite($fh, '$stats[\'max_users\'] = '.$kol.";\n");
fwrite($fh, '$stats[\'max_users_time\'] = '.$now.";\n\n".'?>');
fclose($fh);
if (function_exists('apc_delete_file'))
@apc_delete_file(FORUM_CACHE_DIR.'cache_maxusers.php');
}
}
Вызов ф-ии в common.php такой:
// Update online list
$online_search = '';
$online_users = $online_guests = array();
update_users_online();
В index.php формирование юзеров и рядом
if ($pun_config['o_users_online'] == '1')
{
// Fetch users online info and generate strings for output
$num_guests = count($online_guests);
$num_bots = 0; // Visman
$num_users = count($online_users);
$users = array();
foreach ($online_users as $online_id => $online_name)
{
if ($pun_user['g_view_users'] == '1')
$users[] = "\n\t\t\t\t".'<dd><a href="profile.php?id='.$online_id.'">'.pun_htmlspecialchars($online_name).'</a>';
else
$users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($online_name);
}
foreach ($online_guests as $online_id => $online_name)
{
if (substr($online_name, 0, 5) == '[Bot]')
{
++$num_bots;
$users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($online_name);
}
}
echo "\t\t\t\t".'<dd><span>'.sprintf($lang_index['Users online'], '<strong>'.forum_number_format($num_users).'</strong>').', '.sprintf($lang_index['Guests online'], '<strong>'.forum_number_format($num_guests).'</strong>').'</span></dd>'."\n";
// выводим максимум юзеров, если такой имеется - Visman
@include FORUM_CACHE_DIR.'cache_maxusers.php';
if (defined('PUN_MAXUSERS_LOADED'))
echo "\t\t\t\t".'<dd><span>'. $lang_index['Most online1'].' ('.$stats['max_users'].') '.$lang_index['Most online2'].' '.format_time($stats['max_users_time']).'</span></dd>'."\n\t\t\t".'</dl>'."\n";
else
echo "\t\t\t".'</dl>'."\n";
if ($num_users + $num_bots > 0)
echo "\t\t\t".'<dl id="onlinelist" class="clearb">'."\n\t\t\t\t".'<dt><strong>'.$lang_index['Online'].' </strong></dt>'."\t\t\t\t".implode(',</dd> ', $users).'</dd>'."\n\t\t\t".'</dl>'."\n";
else
echo "\t\t\t".'<div class="clearer"></div>'."\n";
}
else
echo "\t\t\t".'</dl>'."\n\t\t\t".'<div class="clearer"></div>'."\n";
В viewtopic.php запрос и проверка
// Retrieve the posts (and their respective poster/online status)
// мод пола, добавлен u.gender ; мод ограничения времени, добавлен p.edit_post - Visman
// add "g.g_pm, u.messages_enable," - New PMS - "u.warning_all," - Warnings - p.user_agent, - user agent - Visman
$result = $db->query('SELECT u.warning_all, u.email, u.title, u.gender, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, u.messages_enable, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, p.edit_post, p.user_agent, g.g_id, g.g_user_title, g.g_pm FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE p.id IN ('.implode(',', $post_ids).') ORDER BY p.id', true) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
...
// Format the online indicator
$is_online = (isset($online_users[$cur_post['poster_id']])) ? '<strong>'.$lang_topic['Online'].'</strong>' : '<span>'.$lang_topic['Offline'].'</span>';
В search.php
// Prune "old" search results
// $old_searches = array();
// $result = $db->query('SELECT ident FROM '.$db->prefix.'online') or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());
//
// if ($db->num_rows($result))
// {
// while ($row = $db->fetch_row($result))
// $old_searches[] = '\''.$db->escape($row[0]).'\''; implode(',', $old_searches)
if ($online_search != '')
$db->query('DELETE FROM '.$db->prefix.'search_cache WHERE ident NOT IN('.substr($online_search, 1).')') or error('Unable to delete search results', __FILE__, __LINE__, $db->error());
// }
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Продолжаем монолог
У админов и модераторов есть еще один хитрый запрос в каждой странице:
SELECT 1 FROM fo_reports WHERE zapped IS NULL
И иногда он жутко тормозит - 0.04369 (это в десятки/сотни раз медленнее, чем выполнение остальных запросов).
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Кто-нибудь в Опере встречался с таким глюком
Разрушается выводимый div блок, если он полупрозрачен (opacity: 0.9;) (полупрозрачна в общем-то вся страница).
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Еще вопрос: require в любом случае подключает файл, даже если эта строка ни разу не будет выполняться?
Или нет?
Просто вот такие конструкции в коде пишут
if (file_exists(PUN_ROOT.'lang/'.$pun_user['language'].'/poll.php'))
require PUN_ROOT.'lang/'.$pun_user['language'].'/poll.php';
else
require PUN_ROOT.'lang/English/poll.php';
Моя сборка FluxBB 1.5, ForkBB · сообщество
Offline
Нормально сформулировал?
Вот зачем сокращать слова, когда есть дохрена места? Артемий Лебедев пишет, что это чисто кавказская черта. Палишься.
Там что, в одном опросе можно будет сразу много вопросов задавать? Это не голосовалка уже, а анкетирование или тест. Навскидку не могу оценить его целесообразность на форуме. Разве что на специфическом...
Offline
Freeman, небольшой оффтоп. Артемия, несмотря на его заслуги по рисованию Яндекса, после мумусиков, пупусиков, а в особенности, электропочты, воспринимаю как бредогенератор.
Offline
scalemaster, тем не менее, неуместные сокращения на Кавказе я видел своими глазами. Но поскольку бывал в намного меньшем числе мест, чем Лебедев, столь далеко идущие выводы делать не стал.
Зачеркнём про Лебедева, останется лишь здравый смысл: зачем сокращать слова, когда есть дохрена места?
Offline
Кол-во надо заменить на количество. Если Freeman про это, то поддерживаю.
Offline