PDA

View Full Version : очень много запросов к бд


Andruha
13.01.2006, 03:10
Здравствуйте
У меня большая проблема, на днях решил поставить счетчик запросов к БД и был очень сильно растроен.
На главной странице около 100 запросов к БД, а в самом каталоге файлов местами до 300 :cry: :cry: (каталог не родной, Enhanced Downloads Module 2.0 )
Это ужас просто. Неужели данный модуль делали с такими ошибками. Но при том скорость запросов за 0.052498 с.
Хочу узнать как устронить данную проблему ? Где надо править код.

П.С.
Прошу не советовать перейти на другую систему, на тот же Slaed т.к. жалко потраченных сил.

Soniks
13.01.2006, 03:35
Andruha начните с определения какие функции в php-nuke нужны, а какие нет, т.к. в php-nuke есть оочень ного не нужных функций, которые и кушают запросы, например, рефералы, статистика.

kor
13.01.2006, 09:18
Andruha day sayt dlynut?

Andruha
13.01.2006, 10:02
Andruha начните с определения какие функции в php-nuke нужны, а какие нет, т.к. в php-nuke есть оочень ного не нужных функций, которые и кушают запросы, например, рефералы, статистика.
Лишнее убрал уже давно.
Andruha day sayt dlynut?
http://modernmobile.net

kor
13.01.2006, 16:56
у тебя 81 запрос это нормально!!! снижай еще меньше

Andruha
13.01.2006, 18:38
где можно найти материал по данной теме ?
сам не разберусь.

Andruha
13.01.2006, 20:40
Вот к примеру простой блок для вывода последнех статей от Small Pages и только он делает 5 запросов к базе:
<?php
if (eregi("block-Top10_Small_Pages.php",$_SERVER['PHP_SELF'])) {
Header("Location: index.php");
die();
}
global $prefix, $db;
$a = 1;
$result = $db->sql_query("SELECT pid, title, UNIX_TIMESTAMP(date) as postdate, counter FROM ".$prefix."_smallpages WHERE active=1 ORDER
BY pid DESC LIMIT 0,5");
while ($row = $db->sql_fetchrow($result)) {
$pid = intval($row['pid']);
$title = stripslashes($row['title']);
$p_date = date("d/m/Y", $row["postdate"]);
$kol_vo = $db->sql_numrows($db->sql_query("SELECT tid FROM ".$prefix."_smallpages_comments WHERE
pid='$pid'"));
$content .= "<strong><big>&middot;</big></strong>&nbsp;<a
href=\"modules.php?name=Pages&go=page&pid=$pid\"><b>$title</b></a>&nbsp;<em>$p_date</em><br> ";
$a++;
}
?>

Master
14.01.2006, 11:27
Andruha Можно попробывать заменить несколько функций в файле mainfile большого снижения нагрузки не обещаю но всеже!

Открываем mainfile.php

Находим функцию:

function is_admin($admin) {

Заменяем на:
function is_admin($admin) {
global $prefix, $db;
static $adminSave;
if (isset($adminSave)) return ($adminSave);
if(!is_array($admin)) {
$admin = base64_decode($admin);
$admin = explode(":", $admin);
}
$aid = $admin[0];
$pwd = $admin[1];
if ($aid != "" AND $pwd != "") {
$aid = trim($aid);
$sql = "SELECT pwd FROM ".$prefix."_authors WHERE aid='$aid'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$pass = $row['pwd'];
if ($pass == $pwd && $pass != "") {
return $adminSave = 1;
}
}
return $adminSave = 0;
}


Далее находим:
function is_user($user) {

Заменяем на:
function is_user($user) {
global $db, $user_prefix;
static $userSave;
if (isset($userSave)) return ($userSave);
if (!is_array($user)) {
$user = base64_decode($user);
$user = explode(":", $user);
}
$uid = $user[0];
$pwd = $user[2];
$uid = intval($uid);
if ($uid != "" AND $pwd != "") {
$sql = "SELECT user_password FROM ".$user_prefix."_users WHERE user_id='$uid'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$pass = $row['user_password'];
if ($pass == $pwd && $pass != "") {
return $userSave = 1;
}
}
return $userSave = 0;
}

Далее находим:
function blocks($side) {

Заменяем на:
function blocks($side) {
global $storynum, $prefix, $multilingual, $currentlang, $db, $admin, $user;
static $barr;
if ($multilingual == 1) {
$querylang = "AND (blanguage='$currentlang' OR blanguage='')";
} else {
$querylang = "";
}
if (strtolower($side[0]) == "l") {
$pos = "l";
} elseif (strtolower($side[0]) == "r") {
$pos = "r";
} elseif (strtolower($side[0]) == "c") {
$pos = "c";
} elseif (strtolower($side[0]) == "d") {
$pos = "d";
}
$side = $pos;
if (!isset($barr)){
$sql = "SELECT bid, bkey, title, content, url, blockfile, view, expire, action, subscription, bposition FROM ".$prefix."_blocks WHERE active='1' $querylang ORDER BY weight ASC";
$result = $db->sql_query($sql);
while(list($bid, $bkey, $title, $content, $url, $blockfile, $view, $expire, $action, $subscription, $bposition) = $db->sql_fetchrow($result)) {
$bid = intval($bid);
$view = intval($view);
$barr[]= array($bid, $bkey, $title, $content, $url, $blockfile, $view, $expire, $action, $subscription, $bposition);
}
}
for ($i=0; $i<sizeof($barr); $i++){
list ($bid, $bkey, $title, $content, $url, $blockfile, $view, $expire, $action, $subscription, $bposition)=$barr[$i];
if ($bposition==$side){
$now = time();
if ($sub == 0 OR ($sub == 1 AND !paid())) {
if ($expire != 0 AND $expire <= $now) {
if ($action == "d") {
$db->sql_query("UPDATE ".$prefix."_blocks SET active='0', expire='0' WHERE bid='$bid'");
return;
} elseif ($action == "r") {
$db->sql_query("DELETE FROM ".$prefix."_blocks WHERE bid='$bid'");
return;
}
}
if ($view == 0) {
render_blocks($side, $blockfile, $title, $content, $bid, $url);
} elseif ($view == 1 AND is_user($user) || is_admin($admin)) {
render_blocks($side, $blockfile, $title, $content, $bid, $url);
} elseif ($view == 2 AND is_admin($admin)) {
render_blocks($side, $blockfile, $title, $content, $bid, $url);
} elseif ($view == 3 AND !is_user($user) || is_admin($admin)) {
render_blocks($side, $blockfile, $title, $content, $bid, $url);
}
}
}
}
}

Вот вобщем это минимум что можно зделать! :wink:

kor
14.01.2006, 16:39
Master это тока для него или все могут сделать

Andruha
14.01.2006, 18:58
Master спасибо, на несколько запросов стало меньше.
Только вот это минимум, что можно сделать :(

Master
14.01.2006, 20:12
Andruha Всем можно! но тестировал только на нюке 7.6 на других не знаю как будет пробуйте если все работает значит ок :)

Andruha я тебе еще в личные сообщения написал кое что посмотри потом также в личке отпишись мне

kor
15.01.2006, 00:22
у меня после изменениях в mainfile.php на главной странице стало на 3 запроса меньше а под пользователем и под админкой стало с 188 упало до 71 запрос!! спасибо master

Alex76
11.11.2007, 10:57
проверил на версии 8.0 работает прекрассно слов нет со 133 запросов упало до 76 огромное пасибо мастеру