Оптимизация трекера — browse

Список торрентов , он же browse.php . По статистике посещений это вторая страница , наиболее посещаемая пользователями и по этому её оптимизация играет не мало важную роль в снятие нагрузки с сервера .

В стандартном варианте , на странbце используется 2 LEFT JOIN . Для тех кто не в курсе , это зло !

В случае с LEFT JOIN из главной таблицы будут выбраны все записи, даже если в присоединяемой таблице нет совпадений

Есть вариант избавиться от одного из них, путем создания новых полей в таблице torrents . Избавляться будем именно от —

LEFT JOIN users ON torrents.owner = users.id

Этим запросом мы получаем инфо о том , кто загрузил торрент , но можем обойтись и без этого . Мы создадим два поля , которые будут отвечать за те данные , которые мы вытаскивали при помощи LEFT JOIN , это имя и класс .

Сделайте бэкап , прежде чем начать работу !

Для начала , создадим в таблице torrent два новых поля —

ALTER TABLE `torrents` ADD `owner_name` VARCHAR( 255 ) NOT NULL AFTER `owner` ,
ADD `owner_class` INT( 10 ) NOT NULL AFTER `owner_name` ;

Далее , при загрузке торрента изменим запрос, в takeupload.php —

$ret = sql_query("INSERT INTO torrents (search_text, filename, owner, visible, sticky, info_hash, name, size, numfiles, type, descr, ori_descr, free, image1, image2, image3, image4, image5, category, save_as, added, last_action) VALUES (" . implode(",", array_map("sqlesc", array(searchfield("$shortfname $dname $torrent"), $fname, $CURUSER["id"], "no", $sticky, $infohash, $torrent, $totallen, count($filelist), $type, $descr, $descr, $free, $inames[0], $inames[1], $inames[2], $inames[3], $inames[4], 0 + $_POST["type"], $dname))) . ", '" . get_date_time() . "', '" . get_date_time() . "')");

на —

$ret = sql_query("INSERT INTO torrents (search_text, filename, owner, owner_name, owner_class, visible, sticky, info_hash, name, size, numfiles, type, descr, ori_descr, free, image1, image2, image3, image4, image5, category, save_as, added, last_action) VALUES (" . implode(",", array_map("sqlesc", array(searchfield("$shortfname $dname $torrent"), $fname, $CURUSER["id"], $CURUSER['username'], $CURUSER['class'],"no", $sticky, $infohash, $torrent, $totallen, count($filelist), $type, $descr, $descr, $free, $inames[0], $inames[1], $inames[2], $inames[3], $inames[4], 0 + $_POST["type"], $dname))) . ", '" . get_date_time() . "', '" . get_date_time() . "')");

Тут я изменил запрос , следующим образом —
после owner добавил — owner_name, owner_class . Далее после — $CURUSER[«id»] добавил — $CURUSER[‘username’], $CURUSER[‘class’] .

Теперь в browse.php меняем запрос —

$query = "SELECT torrents.id, torrents.moderated, torrents.moderatedby, torrents.category, torrents.leechers, torrents.seeders, torrents.free, torrents.name, torrents.times_completed, torrents.size, torrents.added, torrents.comments, torrents.numfiles, torrents.filename, torrents.sticky, torrents.owner," .
        "IF(torrents.numratings < $minvotes, NULL, ROUND(torrents.ratingsum / torrents.numratings, 1)) AS rating, categories.name AS cat_name, categories.image AS cat_pic, users.username, users.class FROM torrents LEFT JOIN categories ON category = categories.id LEFT JOIN users ON torrents.owner = users.id $where $orderby $limit";

на

 $query = "SELECT torrents.id, torrents.moderated, torrents.moderatedby, torrents.category, torrents.leechers, torrents.seeders, torrents.free, torrents.name, torrents.times_completed, torrents.size, torrents.added, torrents.comments, torrents.numfiles, torrents.filename, torrents.sticky, torrents.owner, torrents.owner_name, torrents.owner_class" .
        "IF(torrents.numratings < $minvotes, NULL, ROUND(torrents.ratingsum / torrents.numratings, 1)) AS rating, categories.name AS cat_name, categories.image AS cat_pic  FROM torrents LEFT JOIN categories ON category = categories.id $where $orderby $limit";

Этот запрос изменился следующим образом —
после torrents.owner добавил torrents.owner_name, torrents.owner_class и удалил — users.username, users.class и LEFT JOIN users ON torrents.owner = users.id .

Далее идем к функцие torrenttable там ищем —

$row["username"] , $row['"class"]

затем заменяем их на соответствующие $row[«username»] -> $row[«owner_name»] и $row[«class»] -> $row[«owner_class»] .

Далее в details.php изменяем запрос —

$res = sql_query("SELECT torrents.seeders, torrents.banned, torrents.leechers, torrents.info_hash, torrents.filename, UNIX_TIMESTAMP() - UNIX_TIMESTAMP(torrents.last_action) AS lastseed, torrents.numratings, torrents.name, IF(torrents.numratings < $minvotes, NULL, ROUND(torrents.ratingsum / torrents.numratings, 1)) AS rating, torrents.owner, torrents.save_as, torrents.descr, torrents.visible, torrents.size, torrents.added, torrents.views, torrents.hits, torrents.times_completed, torrents.id, torrents.type, torrents.numfiles, torrents.image1, torrents.image2, torrents.image3, torrents.image4, torrents.image5, categories.name AS cat_name, users.username FROM torrents LEFT JOIN categories ON torrents.category = categories.id LEFT JOIN users ON torrents.owner = users.id WHERE torrents.id = $id") or sqlerr(__FILE__, __LINE__);

на

$res = sql_query("SELECT torrents.seeders, torrents.banned, torrents.leechers, torrents.info_hash, torrents.filename, UNIX_TIMESTAMP() - UNIX_TIMESTAMP(torrents.last_action) AS lastseed, torrents.numratings, torrents.name, IF(torrents.numratings < $minvotes, NULL, ROUND(torrents.ratingsum / torrents.numratings, 1)) AS rating, torrents.owner,torrents.owner_name,torrents.owner_class, torrents.save_as, torrents.descr, torrents.visible, torrents.size, torrents.added, torrents.views, torrents.hits, torrents.times_completed, torrents.id, torrents.type, torrents.numfiles, torrents.image1, torrents.image2, torrents.image3, torrents.image4, torrents.image5, categories.name AS cat_name FROM torrents LEFT JOIN categories ON torrents.category = categories.id WHERE torrents.id = $id") or sqlerr(__FILE__, __LINE__);

В этом запросе , после — torrents.owner добавил -> torrents.owner_name,torrents.owner_class, и удалил — users.username , LEFT JOIN users ON torrents.owner = users.id .
Так же следует заменить — $row[«username»] на $row[«owner_name»] .

Если у Вас еще где то используеться этот LEF JOIN то можете по такой же схеме зменить запросы .

Но на этом все не заканчиваеться , теперь надо заполнить поля в уже имеющихся торрентах именем и классом того кто загрузил торрент . Это можно сделать весьма приметивным скриптом . Создайте файлик и в нем напишите —

<?php 
require_once ("include/bittorrent.php");
dbconn ();
std_head();
$res = sql_query("SELECT users.username , torrents.owner FROM torrents LEFT JOIN users ON torrents.owner = users.id") or sqlerr ( __FILE__, __LINE__ );
while($row = mysql_fetch_array($res)){
$ownername = $row["username"];
$ownerid = $row[owner];
@sql_query("UPDATE torrents SET owner_name = ".sqlesc($ownername)." WHERE owner = ".sqlesc($ownerid)) or sqlerr ( __FILE__, __LINE__ );
}
std_foot();
?>

и запустите его . Это обновит имена загружающих торренты . для того что бы обновить класс , нужна создать скрипт на подобие предыдущего .

<?php 
require_once ("include/bittorrent.php");
dbconn ();
std_head();
$res = sql_query("SELECT users.class , torrents.owner FROM torrents LEFT JOIN users ON torrents.owner = users.id") or sqlerr ( __FILE__, __LINE__ );
while($row = mysql_fetch_array($res)){
$ownerclass = $row["class"];
$ownerid = $row[owner];
@sql_query("UPDATE torrents SET owner_class = ".sqlesc($ownerclass)." WHERE owner = ".sqlesc($ownerid)) or sqlerr ( __FILE__, __LINE__ );
}
std_foot();
?>

Вот вроде бы все . Если будут какие то ошибки и не ясности , пишите .

Оптимизация трекера — browse: 28 комментариев

  1. KAMuK

    А запрос на важные торренты мона как то оптимизировать? а то я ваще убрал его.. слишком грузить серв :wall:

  2. webnet Автор записи

    🙂 я тоже убрал .
    Можно сделать отдельный блок и кинуть его в кеш . Ну и там соответственно выводить ВАжные торренты .

  3. KAMuK

    Ну ща так и стоит 😉 Лан спс за оптимизацию :beer:

  4. MorAnton

    Пасиба, веб, но я у себя приинклудил обновление имя и класса в клинап и он обновляется у меня раз в три дня, но интересует такой вопрос, за местно (Неизвестно) — это тоесть нет автора, он был удалён остаётся просто пустая форма, как бэ это исправить?!

  5. webnet Автор записи

    А нахерам в клинап пихуть то ? 😮

    С теми кто бы удален , можно поступить иначе . Если строка пустая , то пускай пишется что «Аннонимно» .

    if($row["name"] != "")
    $owner = $row["name"];
    else
    $owner = "Анонимно";

    примерно так .

  6. MorAnton

    Сам посуди, ники и статусы меняются не столь часто, но меняются, тем самым надо обновлять инфу, а раз в 3 дня помоему это выполнить можно

  7. webnet Автор записи

    ники у меня не меняются , а статус , можно и не ставить вовсе . -8

  8. MorAnton

    у нас с тобой разные взгляды на этот счёт)

  9. VictoRD11

    А почему дальше в browse uknown роздающиё ?
    Хоть таблици обновил !

  10. VictoRD11

    да !!! зделал
    з $row[«username»] Поменял на $row[«owner_username»]
    и
    з $row[«class»] поменя на $row[«owner_class»]

  11. Tmadder

    Эта такая фича в бровсе 🙁 делал всё по мануалу, проверял, не пойму в чём дело :wall: , помоги плз вебнет :beer:

  12. webnet Автор записи

    что то ты накосячил . проверь код еще раз .

  13. Tmadder

    хмм, может эт проблем связанный с версией? ибо умя 1 версия юны без форума, а не последняя, хмм

  14. Hannnn

    Нашел пару ошибок.
    Вот вам правильные скрипты

    Плю когда в detalise Запрос правим там

    В этом запросе , после – torrents.owner добавил -> torrents.owner_name,torrents.owner_class >>>> а должно быть В этом запросе , после – torrents.owner добавил -> torrents.owner_name,torrents.owner_class,

  15. NeoN

    в запросе НА который нужно заменить в details.php вместо

    torrent.owner_name,torrent.owner_class,

    надо

    torrents.owner_name,torrenst.owner_class,

  16. XenonAndrei

    Установил, все отлично работает!Спасибо!

  17. webnet Автор записи

    исправь запрос и подкорректируй код . там нету ничего сложного .

  18. Ruffneck

    LEFT JOIN users u ON t.owner = u.id LEFT JOIN usergroups g ON u.usergroup = g.gid ‘ . $where . ‘ ‘ . $orderby . ‘ ‘ . $limit;

    такой запрос можно так сказать переделатЬ ?
    чтоб знал мучаться или нет ! 🙂

  19. Ruffneck

    все получилось спасибо Webnet !

    тока я использую u.last_login вместо last_browse !

    🙁

  20. admin Автор записи

    судя по запросу у тебя не TBDev YSE .
    гуд что все получилось . молодец 😉

  21. Ruffneck

    от TBDEV мало что осталось у меня !
    у ХАМ-а выдираю пхп скрипты и кое что малость от себя
    добавляю !
    хотя в details.php, catalogue.php,manage_torrents.php
    могу пользовать твою оптимизацию !

    Еще раз Спасибо !

Комментарии запрещены.