• Rejestracja
vBHELP.pl - polskie wsparcie vBulletin
Like Tree14Przydatne posty
  • 14 Autor Mateusz
  1. #1
    Awatar Mateusz
    Mateusz jest nieaktywny vBHELP.pl Team
    Dołączył
    Feb 2008
    Przegląda
    Gdańsk
    Posty
    542
    Przydatne posty
    119
    Wpisów
    2

    Domyślnie Optymalizacja vBulletin 4

    Jest to tłumaczenie artykułu opublikowanego na digitalpoint
    Pominąłem część odnoszącą się do poprzednich wersji vB 4.x, bo jednym z warunków posiadania dobrze działającego i zabezpieczonego forum jest używanie najnowszych wersji oprogramowania.
    -----

    Oto kilka porad które mogą przyśpieszyć działanie dużych for opartych na vBulletin (począwszy od najprostszych do najtrudniejszych). Proszę jednak pamiętać o tym, że to co działa u mnie nie musi sprawdzić się u Was (tak więc wszelkie zmiany wprowadzacie na własne ryzyko).


    Wyłącz listę użytkowników
    Możesz łatwo wyłączyć listę użytkowników w panelu administratora. Ustawienia - Opcje - Lista użytkowników i podgląd profilu - Lista użytkowników włączona

    Może tego widzisz, ale zastanów się do czego ona służy... Jest potrzeba użytkownikom do porównywania się z innymi pod względem ilości postów, reputacji itd.

    Czy ktoś w rzeczywiści używa tego do znalezienia kogoś na forum? Pewnie nie... A kiedy ostatnio sam kogoś przez nią wyszukałeś?

    Prawdziwym zastosowaniem tej listy jest dostarczenie spamerom nazw użytkowników do rozsyłania PW. Ponadto ilość zapytań potrzebna do wygenerowania listy jest ogromnym obciążeniem dla serwera.


    Czyszczenie Pamięci Cache
    vBulletin 4 posiada wewnętrzną bazę danych dla pamięci cache która nigdy sama się usuwa. Przedawniona cache pozostaje w bazie do czasu ręcznego opróżnienia całej cache.

    Stwórz wtyczkę w cron_script_cleanup_hourly z poniższym kodem PHP tak aby stara / niepotrzebna pamięć była usuwana co godzinę:

    Kod:
    require_once(DIR . '/includes/class_bootstrap_framework.php');
    vB_Bootstrap_Framework::init();
    vB_Cache::instance()->clean(true);

    Zwiększ prędkość listy prywatnych wiadomości
    Jeśli nigdy nie importowałeś PW z zewnętrznych źródeł (np. ImpEx), możesz bezpiecznie polegać na kolumnie z numerem id, porządek sortowania będzie odpowiadał datom wiadomości.
    Sortując za pomocą pmid serwer nie będzie musiał zrzucać PW do do tymczasowej tabeli aby je posortować.

    Aby to zrobić dodaj wtyczkę w private_messagelist_filter z poniższym kodem:

    Kod:
    if ($sortfield == 'pmtext.dateline') $sortfield = 'pm.pmid';
    Właśnie uczyniłeś private.php ~20% szybszym



    Skuteczniejsze używanie Memcache Datastore
    Jeśli używasz Memcache, możesz przyśpieszyć jego działanie.

    W includes/class_datastore.php wewnątrz zamień

    Kod:
    $unfetched_items = array();
    foreach ($items AS $item)
    {
        $this->do_fetch($item, $unfetched_items);
    }

    na

    Kod:
    if ($this->prefix) {
        foreach ($items as $item) {
            $items_fetch[] = $this->prefix . $item;
        }
    }
    else
    {
        $items_fetch =& $items;
    }
           
    $items_found = $this->memcache->get($items_fetch);
    $unfetched_items = array_keys(array_diff_key(array_flip($items_fetch), $items_found));
    foreach ($items_found AS $key => $data)
    {
        $this->register(substr($key, strlen($this->prefix), 50), $data);
    }
    Ta zamiana przyśpieszy datastore o około 20%. Memcache pomimo tego jest bardzo szybkie, ale jeśli można coś przyśpieszyć to czemu by tego nie zrobić.



    Sprawdź indeksację tematów
    Jeśli któreś z twoich for ma domyślny sposób sortowania tematów niż Data dodania ostaniego posta, powinieneś dodać index do tabeli tematów. Zrobisz to za pomocą tego zapytania:

    Kod:
    ALTER TABLE thread ADD INDEX forumid2_dp (forumid, visible, sticky, dateline)

    Użyj YUI 2.8.x
    vBulletin 4.x korzysta obecnie z nieaktualnej wersji Yahoo User Interface (version 2.7.0). Możesz łatwo zamienić 2.7.0 na 2.8.x bez żadnych problemów (2.8.x ma wiele poprawek).

    Najprostszym sposobem zmiany wersji jest wejście w Ustawienia-Opcje-Ustawienia serwera i optymalizacja - Używaj YUI ustawienie na Google lub Yahoo. Później należy edytować plik includes/class_core.php:
    Zamień:

    Kod:
    define('YUI_VERSION', '2.7.0'); // define the YUI version we bundle
    Na to:

    Kod:
    define('YUI_VERSION', '2.8.2'); // define the YUI version we bundle
    Ustawienie trybu SQL
    Jeśli nie zmieniałeś trybu sql_mode w ustawieniach serwera MySQL możesz w pliku includes/init.php zmienić linijkę:

    Kod:
    $db->force_sql_mode('');
    na

    Kod:
    // $db->force_sql_mode('');
    Nie jest to wielka zmiana, ale jedno zapytanie mniej na każdą stronę to zawsze coś.

    showgroups.php Query Cache
    Jedno z zapytań w showgroups.php działa coraz wolniej gdy przybywa Ci użytkowników.

    Zamień poniższy kod w showgroups.php

    Kod:
    // get usergroups who should be displayed on showgroups
    // Scans too many rows. Usergroup Rows * User Rows
    $users = $db->query_read_slave("
        SELECT user.*,
            usergroup.usergroupid, usergroup.title,
            user.options, usertextfield.buddylist,
            " . ($show['locationfield'] ? 'userfield.field2,' : '') . "
            IF(user.displaygroupid = 0, user.usergroupid, user.displaygroupid) AS displaygroupid
            " . ($vbulletin->options['avatarenabled'] ? ",avatar.avatarpath, NOT ISNULL(customavatar.userid) AS hascustomavatar, customavatar.dateline AS avatardateline,customavatar.width AS avwidth,customavatar.height AS avheight, customavatar.width_thumb AS avwidth_thumb, customavatar.height_thumb AS avheight_thumb, filedata_thumb, NOT ISNULL(customavatar.userid) AS hascustom" : "") . "
        FROM " . TABLE_PREFIX . "user AS user
        LEFT JOIN " . TABLE_PREFIX . "usergroup AS usergroup ON(usergroup.usergroupid = user.usergroupid OR FIND_IN_SET(usergroup.usergroupid, user.membergroupids))
        LEFT JOIN " . TABLE_PREFIX . "userfield AS userfield ON(userfield.userid = user.userid)
        LEFT JOIN " . TABLE_PREFIX . "usertextfield AS usertextfield ON(usertextfield.userid=user.userid)
        " . ($vbulletin->options['avatarenabled'] ? "LEFT JOIN " . TABLE_PREFIX . "avatar AS avatar ON(avatar.avatarid = user.avatarid) LEFT JOIN " . TABLE_PREFIX . "customavatar AS customavatar ON(customavatar.userid = user.userid)" : "") . "
        WHERE (usergroup.genericoptions & " . $vbulletin->bf_ugp_genericoptions['showgroup'] . ")
    ");
    
    $groupcache = array();
    while ($user = $db->fetch_array($users))
    {
        $t = strtoupper($user['title']);
        $u = strtoupper($user['username']);
        $groupcache["$t"]["$u"] = $user;
    }
    Na ten:

    Kod:
    require_once(DIR . '/includes/class_bootstrap_framework.php');
    vB_Bootstrap_Framework::init();
    if (!$groupcache = vB_Cache::instance()->read('showgroups.groupcache')) {
    
        // get usergroups who should be displayed on showgroups
        // Scans too many rows. Usergroup Rows * User Rows
        $users = $db->query_read_slave("
            SELECT user.*,
                usergroup.usergroupid, usergroup.title,
                user.options, usertextfield.buddylist,
                " . ($show['locationfield'] ? 'userfield.field2,' : '') . "
                IF(user.displaygroupid = 0, user.usergroupid, user.displaygroupid) AS displaygroupid
                " . ($vbulletin->options['avatarenabled'] ? ",avatar.avatarpath, NOT ISNULL(customavatar.userid) AS hascustomavatar, customavatar.dateline AS avatardateline,customavatar.width AS avwidth,customavatar.height AS avheight, customavatar.width_thumb AS avwidth_thumb, customavatar.height_thumb AS avheight_thumb, filedata_thumb, NOT ISNULL(customavatar.userid) AS hascustom" : "") . "
            FROM " . TABLE_PREFIX . "user AS user
            LEFT JOIN " . TABLE_PREFIX . "usergroup AS usergroup ON(usergroup.usergroupid = user.usergroupid OR FIND_IN_SET(usergroup.usergroupid, user.membergroupids))
            LEFT JOIN " . TABLE_PREFIX . "userfield AS userfield ON(userfield.userid = user.userid)
            LEFT JOIN " . TABLE_PREFIX . "usertextfield AS usertextfield ON(usertextfield.userid=user.userid)
            " . ($vbulletin->options['avatarenabled'] ? "LEFT JOIN " . TABLE_PREFIX . "avatar AS avatar ON(avatar.avatarid = user.avatarid) LEFT JOIN " . TABLE_PREFIX . "customavatar AS customavatar ON(customavatar.userid = user.userid)" : "") . "
            WHERE (usergroup.genericoptions & " . $vbulletin->bf_ugp_genericoptions['showgroup'] . ")
        ");
    
        $groupcache = array();
        while ($user = $db->fetch_array($users))
        {
            $t = strtoupper($user['title']);
            $u = strtoupper($user['username']);
            $groupcache["$t"]["$u"] = $user;
        }
    
        vB_Cache::instance()->write('showgroups.groupcache', $groupcache, 360);
    }

    U nas showgroups.php przyśpieszyło około x6.

    Wyłącz szybką nawigację
    Wyłącz opcję: Używaj menu 'Skocz do forum' w ACP - Ustawienia - Opcje - Generalne ustawienia
    Prawie w ogóle nie używane, a powoduje spore obciążenie.

    Upewnij się jakie produkty instalujesz
    To że ktoś napisał aplikację nie oznacza że sprawdzi się ona na dużym forum. Świetnym przykładem jest iTrader. Używany tego produktu na forum, ale dopiero po tym jak wprowadziliśmy wiele zmian i poprawek.

    Najlepszym sposobem jest założyć że programista nie wie co pisze i przebrnąć samemu przez kod przez instalacją. Upewnij się że produkt nie powoduje dużego obciążenia dla bazy, nie jest podatny na potencjalne ataki SQL injection lub XSS. Niestety aplikacji jest tak dużo, a polegać możesz tylko na sobie (lub kogoś wynająć).
    Max, wilu, day-dreamer i 11 innych uznają to za przydatne.



  2. #2
    mateusz2505 jest nieaktywny Początkujący
    Dołączył
    Mar 2010
    Posty
    18

    Domyślnie

    Cytat Zamieszczone przez $md Zobacz posta
    Czyszczenie Pamięci Cache
    vBulletin 4 posiada wewnętrzną bazę danych dla pamięci cache która nigdy sama się usuwa. Przedawniona cache pozostaje w bazie do czasu ręcznego opróżnienia całej cache.

    Stwórz wtyczkę w cron_script_cleanup_hourly z poniższym kodem PHP tak aby stara / niepotrzebna pamięć była usuwana co godzinę:

    Kod:

    require_once(DIR . '/includes/class_bootstrap_framework.php');
    vB_Bootstrap_Framework::init();
    vB_Cache::instance()->clean(true);


    Zwiększ prędkość listy prywatnych wiadomości
    Jeśli nigdy nie importowałeś PW z zewnętrznych źródeł (np. ImpEx), możesz bezpiecznie polegać na kolumnie z numerem id, porządek sortowania będzie odpowiadał datom wiadomości.
    Sortując za pomocą pmid serwer nie będzie musiał zrzucać PW do do tymczasowej tabeli aby je posortować.

    Aby to zrobić dodaj wtyczkę w private_messagelist_filter z poniższym kodem:

    Kod:

    if ($sortfield == 'pmtext.dateline') $sortfield = 'pm.pmid';

    Właśnie uczyniłeś private.php ~20% szybszym
    Jak to dodać?


  3. #3
    Awatar Mateusz
    Mateusz jest nieaktywny vBHELP.pl Team
    Dołączył
    Feb 2008
    Przegląda
    Gdańsk
    Posty
    542
    Przydatne posty
    119
    Wpisów
    2

    Domyślnie

    Czyszczenie Pamięci Cache:
    System wtyczek i modyfikacji - Dodaj Nową Wtyczkę - Lokalizacja - cron_script_cleanup_hourly



    Zwiększ prędkość listy prywatnych wiadomości:
    System wtyczek i modyfikacji - Dodaj Nową Wtyczkę - Lokalizacja - private_messagelist_filter



    Kod PHP Wtyczki: tutaj wpisujesz podane kody


Chmurka.pl

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67