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ąć).