Удаление папки /install/ - обязательно!

Файловый Архив

  • Неограниченное количество категорий и суб-категорий
  • Настройки прав доступа по группам
  • Настройки прав доступа по каждой категории
  • Предпросмотр медиа файлов: FLV, IFLV, F4A, F4V, MP4, MP3, MOV и других...
  • Мультизагрузка файлов - SWFUploader
  • Добавление файлов с сервера
Подробности и история обновлений продукта в этой теме
Loading

Go Back   форум vBSupport.org > > >
Register Изображения Меню vBsupport Files Manager Аллея Звёзд Реклама на форуме Search Today's Posts Mark Forums Read
  • Мемберка
  • Администраторам
  • Premoderation
  • For English speaking users
  • Изменения в правах
  • Каталог Фрилансеров
Пароли на скачивание файлов в Member Area меняются автоматически каждый день
Если вам нужно скачать какой то скрипт, за паролем ко мне в ЛС
привет какирам kerk
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Не можете скачать вложение?
Изменения в правах групп пользователей
внимательно читаем эту и эту темы
Короткая версия - тут
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

 
 
Old  
Yoskaldyr
Специалист
Default Расширение стандартной системы кеширования vb 3

Не знаю как кто, но лично мне довольно часто нужно использовать какой либо кеш при написании хаков, чтобы лишний раз не дергать базу. Стандартная система кеширования vb (класс vbDatastore) не совсем подходит, т.к. она оптимизирована под один большой запрос всех данных при инициализации vb (еще до Init хука) и даже если используется любой внешний (xcache, ea, apc, memcached) все равно пишет дубликат в базу (datastore), как следствие этот класс не совсем подходит для частого изменения кеша, например для хаков типа чата (для информации - нет ни одного нормального чата для булки выдерживающего нормальные нагрузки).
Написать что-то жестко заточенное под конкретный кеш для меня не составляет проблем, но это совсем не подходит для публичных хаков, т.к. очень жесткая заточка под конкретную конфигурацию сервера, да и не красиво это.
Может есть у кого или универсальный класс не конфликтующий со стандартным классом булки для однотипной работы с xcache, ea, apc, memcached. И конечно желательно проверенный в работе, т.к. классов существует много, и проверить совместимость и не конфликтность со стандартным классом я могу только для xcache (под хорошей нагрузкой) и ea (без нагрузки).

P.S. Вообще-то уже и сам написал такой класс на базе класса булки и по идее он не должен конфликтовать со стандартным (для xcache точно работает без проблем под нагрузкой), но протестировать для всех кешей не было возможности (особенно критична совместимость со стандартным классом vb memcached-а, т.к. там коннекты к серверу, флаг подсоединенности и т.д. и т.п.).

Добавил файл с функциями расширяющим функционал обращения к варкешу (датастору). Расширение в плане прямого добавления/ прямого извлечения / прямого удаления записей из кеша + работа с TTL.

Работает с eAccelerator, XCache, APC
Не работает с Filecache и Memcached. Первый (Filecache) даже не рассматривал ввиду его скорости, второй не было где нормально протестировать (да и скорость у мемкеша тоже не очень)

Функции:
isenabled_datastore() - проверка что включен поддерживаемый датастор
get_datastore($title, $unserialize_detect = 2) - прямое извлечение записи из датастора (unserialize_detect аналогичен стандартному функционалу vb) возвращает null если запись извлечь не удалось
set_datastore($title, &$data, $ttl=null) - запись данных в датастор
delete_datastore($title) - удалить запись из датастора.

Все производимые операции с датастором никак не трогают датастор в базе, т.е. это не столько использование датастора, а сколько небольшая навеска для прямого использования установленного варкеша.
Attached Files
File Type: zip functions_datastore.zip (821 Bytes, 15 views)

Last edited by Yoskaldyr : 04-03-2010 at 01:54 AM. Reason: Добавил файл с функциями.
 
Old  
Yoskaldyr
Специалист
Default 0

Quote:
Originally Posted by netwind View Post
да я не то имел ввиду.даже вообще без хаков, получается, что одна пренебрежимо маленькая часть работы по получению данных из кеша в разделяемой памяти в 1000 раз меньше другой маленькой части - хранения данных в mysql. И собственно, зачем этим вообще заморачиваться?
Определенно стоит если памяти мало (вдс), т.к. включение кеша запросов на мускуле значительно более затратный расход памяти чем выделение 3-4Мб под варкеш. Пример: запрос из датастора - абсолютно разный в каждом скрипте, т.е. хранение результатов в кеше - займет на порядок больше памяти, чем полный набор всех единичных экземпляров датастора в варкеше. Т.е. в варкеше отдельно настройки, отдельно форумкеш и т.д., а в кеше запросов мускуля набор их различных комбинаций.
Quote:
Originally Posted by netwind View Post
Главное, чтобы кеш был и там хранились данные действительно сложных операций.
Реально булка выбирает из мускуля значительные объемы постоянной информации, т.е. не столько сложные запросы, запросы как раз очень простые, сколько большие объемы данных. Вот их на порядок эффективнее кешировать в варкеше (те же шаблоны). Вот использовать кеш мускуля для хранения результатов сложных запросов - самое то, только плохо применимо к булке, из-за практически отсутствия таковых (исключение - кривые хаки)
 
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
Old  
netwind
Гуру
 
netwind's Avatar
Default 0

Quote:
Originally Posted by Yoskaldyr View Post
Да и от постоянного обновления lastactivity в user (которое как раз сбрасывает кеш мускуля) можно избавиться, перенеся в крон - всего то пара строчек кода.
А что конкретно делать?
думал перенести в cron, но получается нужно и от обновления lastvisit избавляться, а на большом форуме сессии начинаются довольно часто и кеш user сбрасывается уже по причине обновления lastvisit. Просто так избавляться от нее нельзя, потому что на этом поле основывается механизм пометки новых тем.
 
Old  
m0rbid
Продвинутый
Default 0

Quote:
Originally Posted by Yoskaldyr View Post
P.S. После детального исследования кода, стало понятно что разрабы специально пооставляли для себя лазейки по оптимизации. Чего только стоит выгрузка шаблонов в файлы и потом загрузка их из ФС (стандартный функционал зарытый глубоко в коде)
Этот функционал зарыт в админке и довольно-таки на виду, не заметить трудно.
admincp/template.php?do=files
 
Old  
Yoskaldyr
Специалист
Default 0

Quote:
Originally Posted by m0rbid View Post
Этот функционал зарыт в админке и довольно-таки на виду, не заметить трудно.
admincp/template.php?do=files
да, выгрузка есть, но вот загрузки файлов и работы напрямую с файлами - нет. Вернее есть, но код который использует отдельные файлы в булке закоментирован. Т.е. именно то что я и говорил, что разработчики предусмотрели, но предусмотреть совсем не значит использовать

Yoskaldyr добавил 12.05.2010 в 23:12
вот он код как раз из fetch_template
PHP Code:
    // **************************
    /*
    if ($template == '<<< FILE >>>')
    {
        $template = addslashes(implode('', file("./templates/$templatename.html")));
        $vbulletin->templatecache["$templatename"] = $template;
    }
    */
    // ************************** 

Last edited by Yoskaldyr : 05-13-2010 at 12:12 AM. Reason: Добавлено сообщение
 
Old  
m0rbid
Продвинутый
Default 0

Quote:
Originally Posted by netwind View Post
кеш user сбрасывается уже по причине обновления lastvisit
обьясните почему, и где этот "сброс" можно увидеть?
в ядре не нашел.

PHP Code:
    /**
    * Updates the last visit and last activity times for guests and registered users (differently).
    * Last visit is set to the last activity time (before it's updated) only when a certain
    * time has lapsed. Last activity is always set to the specified time.
    *
    * @param    integer    Time stamp for last visit time (guest only)
    * @param    integer    Time stamp for last activity time (guest only)
    */
    
function do_lastvisit_update($lastvisit 0$lastactivity 0)
    {
        
// update last visit/activity stuff
        
if($this->vars['userid'] == 0)
        {
            
// guest -- emulate last visit/activity for registered users by cookies
            
if($lastvisit)
            {
                
// we've been here before
                
$this->user['lastvisit'] = intval($lastvisit);
                
$this->user['lastactivity'] = ($lastvisit intval($lastvisit) : CURR_TIME);

                
// here's the emulation
                
if(CURR_TIME $this->user['lastactivity'] > $this->registry->options['cookietimeout'])
                {
                    
$this->user['lastvisit'] = $this->user['lastactivity'];

                    
cookie_set('lastvisit'$this->user['lastactivity']);
                }
            }
            else
            {
                
// first visit!
                
$this->user['lastactivity'] = CURR_TIME;
                
$this->user['lastvisit'] = CURR_TIME;

                
cookie_set('lastvisit'CURR_TIME);
            }

            
cookie_set('lastactivity'$lastactivity);
        }
        else
        {
            
// registered user
            
if(!SESSION_BYPASS)
            {
                if(
CURR_TIME $this->user['lastactivity'] > $this->registry->options['cookietimeout'])
                {
                    
// see if session has 'expired' and if new post indicators need resetting
                    
$this->registry->db->shutdown_query("
                        UPDATE "
.TPREFIX."user
                        SET
                            lastvisit = lastactivity,
                            lastactivity = "
.CURR_TIME."
                        WHERE userid = "
.$this->user['userid']."
                    "
'lastvisit');

                    
$this->user['lastvisit'] = $this->user['lastactivity'];
                }
                else
                {
                    
// if this line is removed (say to be replaced by a cron job, you will need to change all of the 'online'
                    // status indicators as they use $user['lastactivity'] to determine if a user is online which relies
                    // on this to be updated in real time.
                    
$this->registry->db->shutdown_query("
                        UPDATE "
.TPREFIX."user
                        SET lastactivity = "
.CURR_TIME."
                        WHERE userid = "
.$this->user['userid']."
                    "
'lastvisit');
                }
            }
        }
    } 
m0rbid добавил 12.05.2010 в 23:25
Quote:
Originally Posted by Yoskaldyr View Post
да, выгрузка есть, но вот загрузки файлов и работы напрямую с файлами - нет. Вернее есть, но код который использует отдельные файлы в булке закоментирован. Т.е. именно то что я и говорил, что разработчики предусмотрели, но предусмотреть совсем не значит использовать

Yoskaldyr добавил 12.05.2010 в 23:12
вот он код как раз из fetch_template
PHP Code:
    // **************************
    /*
    if ($template == '<<< FILE >>>')
    {
        $template = addslashes(implode('', file("./templates/$templatename.html")));
        $vbulletin->templatecache["$templatename"] = $template;
    }
    */
    // ************************** 
да, из файла оно загрузит. Только механизм забивания в файл распарсенных шаблонов нигде в движке не реализовано.
Это коменнтарий - рудимент оставшийся от древнейших версий.

Кстати я юзаю вашу суперсистему уже давно.

вот мой аналог функции:

PHP Code:
function get_tpl($tpl_name)
{
    global 
$style$bb;

    switch(
THIS_AREA)
    {
        case 
'ModCP':         $dir_add $bb->CFG['MCP_DIR'];     break;
        case 
'AdminCP':     $dir_add $bb->CFG['ACP_DIR'];     break;
        
        default:             
$dir_add '';
    }

    if(isset(
$bb->tpl_cache[$tpl]))
    {
        
$tpl $bb->tpl_cache[$tpl];
    }
    else if(
file_exists(DIR.$dir_add.'/tpl/'.$tpl_name.'.tpl'))
    {
        
$tpl implode(''file(DIR.$dir_add.'/tpl/compiled/'.$tpl_name.'.tpl'));
        
$bb->tpl_cache[$tpl_name] = $tpl;
    }
    else
    {
        
$tpl '';
    }

    return 
$tpl;

Только не пугайтесь))) когдато, это была вобла.

Last edited by m0rbid : 05-13-2010 at 12:25 AM. Reason: Добавлено сообщение
 
Old  
Yoskaldyr
Специалист
Default 0

Quote:
Originally Posted by netwind View Post
А что конкретно делать?
ответил в личку. Кеш все равно сбрасываться будет, но не так часто.

Yoskaldyr добавил 12.05.2010 в 23:31
Quote:
Originally Posted by m0rbid View Post
обьясните почему, и где этот "сброс" можно увидеть?
Вы не поняли о каком кеше идет речь. Идет речь о кеше Mysql, который конечно сбрасывается если таблица обновилась, а вот как раз таблица user постоянно и обновляется из-за lastvisit/lastactivity

Yoskaldyr добавил 12.05.2010 в 23:36
m0rbid, Весь код цитировать не буду, но вопрос где в нем скомпилированный шаблон??? Под скомпилированным шаблоном обычно понимают готовый PHP код, который кешируется опкод кешем (не варкешем, а именно опкод). Т.е. PHP не надо при обращении к PHP коду каждый раз его компилировать. В моей реализации время eval-а сведено к минимуму, и нет изменений оригинального кода.
К тому же Ваша реализация в некоторых случаях на порядок медленнее встроенной системы извлечения шаблонов будет работать.

Last edited by Yoskaldyr : 05-13-2010 at 12:38 AM. Reason: Добавлено сообщение
 
Old  
m0rbid
Продвинутый
Default 0

Quote:
Originally Posted by Yoskaldyr View Post
Вы не поняли о каком кеше идет речь. Идет речь о кеше Mysql, который конечно сбрасывается если таблица обновилась, а вот как раз таблица user постоянно и обновляется из-за lastvisit/lastactivity
хм... чирканите и мне в личку))

m0rbid добавил 12.05.2010 в 23:46
Quote:
Originally Posted by Yoskaldyr View Post
К тому же Ваша реализация в некоторых случаях на порядок медленнее встроенной системы извлечения шаблонов будет работать.
в каких например? Невижу для этого причин.
оригинал:

PHP Code:
    if (isset($vbulletin->templatecache["$templatename"]))
    {
        
$template $vbulletin->templatecache["$templatename"];
    }
    else
    {
        
DEVDEBUG("Uncached template: $templatename");
        
$GLOBALS['_TEMPLATEQUERIES']["$templatename"] = true;

        
$fetch_tid intval($templateassoc["$templatename"]);
        if (!
$fetch_tid)
        {
            
$gettemp = array('template' => '');
        }
        else
        {
            
$gettemp $vbulletin->db->query_first_slave("
                SELECT template
                FROM " 
TABLE_PREFIX "template
                WHERE templateid = 
$fetch_tid
            "
);
        }
        
$template $gettemp['template'];
        
$vbulletin->templatecache["$templatename"] = $template;
    } 
разница лишь в месте где мы храним шаблон. бд/файлы

Last edited by m0rbid : 05-13-2010 at 12:46 AM. Reason: Добавлено сообщение
 
Old  
Yoskaldyr
Специалист
Default 0

m0rbid, В качестве примера выбран совсем не тот кусок кода. Вы не проверили весь код до этого и не поняли логики системы кеширования шаблонов в булке.
В нормальном режиме работы в fetch_temopletе вообще не должно выполняться ни одного запроса, все шаблоны находятся уже в $vbulletin->templatecache. А SQL-запрос в предложенном фрагменте - только для незакешированного шаблона, а это уже неправильная работа или кривой хак.

и не важно откуда берется шаблон в fetch_template, все равно он потом идет через eval - а это лишние накладные расходы. Именно об этом я и говорил.

Хотя время именно eval-а (т.е. парсинга PHP кода PHP процессором) можно сократить. Как я это сделал не буду говорить, хотя в принципе все просто.

P.S. m0rbid, Если я правильно понял, то предложенный Вами код находится в fetch_template, а это все-таки неправильно и неэффективно. Если да, то внутри fetch_template дергать файлы - это неправильно. Зачем это делать, если шаблон уже должен находиться в памяти ($vbulletin->templatecache)
 
Old  
m0rbid
Продвинутый
Default 0

Quote:
Originally Posted by Yoskaldyr View Post
Если я правильно понял, то предложенный Вами код находится в fetch_template, а это все-таки неправильно и неэффективно. Если да, то внутри fetch_template дергать файлы - это неправильно. Зачем это делать, если шаблон уже должен находиться в памяти ($vbulletin->templatecache)
оно их и не дергает.. это как раз на случай кривизны.

$vbulletin->templatecache == $bb->tpl_cache
 
Old  
Yoskaldyr
Специалист
Default 0

Quote:
Originally Posted by m0rbid View Post
оно их и не дергает.. это как раз на случай кривизны.
Ну не видя всего кода, точно сказать довольно трудно - только угадывать. Я просто предположил что get_tpl аналог fetch_template.
Но все равно дергать шаблоны из вар-кеша быстрее чем из файлов

К тому же все равно eval больших кусков PHP кода никуда не делся
 
 

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 04:17 PM.


Powered by vBulletin® Version 3.0.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.