Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#51 2010-11-26 19:30:40

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

конечно пробовал. только я в конфиг это добавляю. сначала PUN_DEBUG, а за ним PUN_SHOW_QUERIES


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#52 2010-11-26 19:53:41

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

artoodetoo, я уже разобрался - не на том сервере правил файлы cool

Теперь другая проблема вылезла.
Оказывается, с выходом версии PHP 5.3.0 некоторые функции были признаны устаревшими и были заменены на другие.
И PHP начал ругаться на

eregi('^(www\.)?(.*)$', $_SERVER['HTTP_HOST'], $regs);

таким образом

PHP Deprecated:  Function eregi() is deprecated in

Offline

#53 2010-11-26 21:02:56

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Заменил так

//    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);

Offline

#54 2010-11-27 20:46:15

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

В просмотре темы есть такой запрос к базе

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 можно формировать из другого выполняемого запроса и не только тут.

Offline

#55 2010-11-28 05:31:49

hcs
Administrator
Зарегистрирован: 2008-09-05
Сообщений: 85

Re: Вопрос по применению javascript и другие вопросы от меня

Вероятно ничего не даст. Но это следует подтвердить экспериментально.
Из какого другого запроса ты сформируешь данные on-line об отписавшихся в теме?

Offline

#56 2010-11-28 06:18:28

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

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. В поиске - в некоторых запросах убирается один запрос к базе.

Offline

#57 2010-11-28 13:32:41

hcs
Administrator
Зарегистрирован: 2008-09-05
Сообщений: 85

Re: Вопрос по применению javascript и другие вопросы от меня

Ну тогда это хороший вариант

Offline

#58 2010-11-28 19:14:58

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

хорошо бы замеры скорости. меня смущает, что online уже "закеширован" - его тип хранения MEMORY (синоним HEAP).


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#59 2010-11-28 19:31:09

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

artoodetoo, как это сделать объективно?
У меня например при одном и том же открытии страницы бывают гиганские скачки в выполнении.

Offline

#60 2010-11-29 00:10:29

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

усредненно на множестве прогонов.
apache ab


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#61 2010-11-29 08:44:33

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Сделал маленький тест на тестовом форуме (который в инете) пробежав все страницы тем по 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

В обоих случаях на форуме я был один.

Offline

#62 2010-11-29 10:41:44

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 887
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

круто


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#63 2010-11-29 14:28:12

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

В общем поставил себе на основной форум изменение с онлайн пользователями на index.php и viewtopic.php.
На глаз по [ Сгенерировано за 0.019 сек, 10 запросов выполнено - Использовано памяти: 2.88 MB (Пик: 3.05 MB) ] изменений не осущается, в том числе из-за генерации массивов онлайн пользователей в PHP.
По таблице запросов к базе, запросы представленные выше показывают выигрышь.
Так что не знаю, включать это изменение в сборку или нет!?
Надо бы на простых серверах потестить, а не навыделенном.

Offline

#64 2010-11-29 16:55:43

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

В общем так:
Ф-ия 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());
//        }

Offline

#65 2010-11-30 06:06:06

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Продолжаем монолог wink
У админов и модераторов есть еще один хитрый запрос в каждой странице:

SELECT 1 FROM fo_reports WHERE zapped IS NULL

И иногда он жутко тормозит - 0.04369 (это в десятки/сотни раз медленнее, чем выполнение остальных запросов).

Offline

#66 2010-11-30 08:45:48

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Тест на тысячу гостей:
1111110.th.gif 222222z.th.gif

Offline

#67 2010-11-30 08:50:56

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Все 1000 гостей разом сбежали  big_smile
333333v.th.gif

Offline

#68 2010-12-13 15:34:33

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Наваял такую сташенную вещь
11111ru.th.jpg

Offline

#69 2010-12-13 17:24:29

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Кто-нибудь в Опере встречался с таким глюком
dddddddh.th.jpg
Разрушается выводимый div блок, если он полупрозрачен (opacity: 0.9;) (полупрозрачна в общем-то вся страница).

Offline

#70 2010-12-28 12:38:26

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

fffffk.th.gif

Нормально сформулировал?
Или подсказку надо: 1 - простой ответ, 2 и больше - многовариантный.

Offline

#71 2010-12-28 19:44:23

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,236
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Еще вопрос: require в любом случае подключает файл, даже если эта строка ни разу не будет выполняться?
Или нет?

Просто вот такие конструкции в коде пишут wink

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';

Offline

#72 2010-12-28 22:24:52

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

Visman пишет:

Нормально сформулировал?

Вот зачем сокращать слова, когда есть дохрена места? Артемий Лебедев пишет, что это чисто кавказская черта. Палишься. lol

Там что, в одном опросе можно будет сразу много вопросов задавать? Это не голосовалка уже, а анкетирование или тест. Навскидку не могу оценить его целесообразность на форуме. Разве что на специфическом...

Offline

#73 2010-12-28 23:58:47

scalemaster
Участник
Зарегистрирован: 2009-08-10
Сообщений: 134

Re: Вопрос по применению javascript и другие вопросы от меня

Freeman, небольшой оффтоп. Артемия, несмотря на его заслуги по рисованию Яндекса, после мумусиков, пупусиков, а в особенности, электропочты, воспринимаю как бредогенератор.

Offline

#74 2010-12-29 00:17:29

Freeman
Участник
Из Санкт-Петербург
Зарегистрирован: 2010-07-31
Сообщений: 128
Сайт

Re: Вопрос по применению javascript и другие вопросы от меня

scalemaster, тем не менее, неуместные сокращения на Кавказе я видел своими глазами. Но поскольку бывал в намного меньшем числе мест, чем Лебедев, столь далеко идущие выводы делать не стал.

Зачеркнём про Лебедева, останется лишь здравый смысл: зачем сокращать слова, когда есть дохрена места?

Offline

#75 2010-12-29 02:21:36

scalemaster
Участник
Зарегистрирован: 2009-08-10
Сообщений: 134

Re: Вопрос по применению javascript и другие вопросы от меня

Кол-во надо заменить на количество. Если Freeman про это, то поддерживаю.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens