воскресенье, 20 июля 2008 г.

Оптимизация сайта на движке PHP-Nuke.

Решил выложить оптимизацию нюки или как тренировался на ней, в следствии того что

когда подумал о создании сайта, люди посоветовали: ты что будешь писать сайт сам?

Ну ты дурак, есть же готовые сайты CMS называются, и дали адрес где можно скачать,

это была 8 я русская версия php-nuke. Подумал: что за хрень? И давай искать другие

cms системы. Наткнулся на DLE, mambo, slaed, post-nuke, small-nuke, Joomla.



В историю впадать не буду, ближе к телу. Короче, на тот момент для меня был понятен

довольно простой язык программирования pascal и не более, посмотрев исходные файлы

cms понял, что с классами у меня напряг ничего не понимаю, в литературе довольно

доступно объяснили php - не классовый язык программирования, хотя классы более

менее полноценно ввелись в 4 версии, все сайтики с классами отпали, потом

понял что существует еще так называемая скорость работы сайта или интерпритация

кода сервером, оказалось что www.PHP-nuke.org – самая требовательная к ресурсам,

но было уже поздно, т.к на нее рисовался дизайн, а переделывать уже не

хотелось(вот такое я ленивое дерево). Сейчас конечно многие возразят и скажут:

а 5 ка на что? Ну не доходят руки до классов, если понять их на самом деле все

просто и нету ничего страшного.



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

ЕСЛИ кто-то увидит куски своего кода не обижайтесь и не пинайте ногами,

копирайты ваши поставлю, т.к не помню что от куда брал.


1. Основа: PHPNUKE_80_RUS_291006.zip =) запросов на гостя - 66. Для определения

количства запросов на сайте, делаем довлольно простую вещь: тут типа код <php>

находим любой редактор блокнот тоже подходит, но в нем не удобно смотреть,

много буковок и все сливаются, многие файлы идут *nix форматом соответственно

страдает перенос строк, я пользуюсь PSPAD адрес в интернете : www.pspad.com

качаете русскую версию и удобно смотрите, конечно есть и другие редакторы но

о них сейчас разговора нет (и мега профи с каким-нибудь образованием это читать

не будут посчитая ниже следующее бредом, но сам в свое время искал тупил не мог

в одном месте все найти решил выложить может что кому поможет),

далее, открываем файл footer.php (находиться в корневой

директории сайта, тамже где и mainfile.php, admin.php, modules.php) находи там

function footmsg() и после $total_time = ($end_time - $start_time);

дописываем:



$sqlnums= $db->num_queries;

$all= $db->all_db;

$total_time = ""._PAGEGENERATION." ".substr($total_time,0,5)." Секунд";

$total_time.=' <br>Время запроса к БД: '.$all;



if (file_exists(INCLUDE_PATH."admin/config_rus.php")) {

include(INCLUDE_PATH."admin/config_rus.php");

if ($show_sqlcount==true) {

global $db;

$sqlnums= $db->num_queries;

$total_time .= " и ".$sqlnums." запросов к БД";

}

} // это помоему из очередного коварного релиза на rus-phpnuke.com



в этом же файле находим сроки:

themefooter();

if (file_exists("includes/custom_files/custom_footer.php")) {

include_once("includes/custom_files/custom_footer.php");

}



И после них добавляем:



// Показ запросов, произведенных к БД при формировании страницы

if (file_exists(INCLUDE_PATH."admin/config_rus.php")) {

include(INCLUDE_PATH."admin/config_rus.php");

if ($show_debug==true) {

$sqlqueries=$db->text_queries;

echo "<center><b>Запросы к БД:</b></center><HR><font class=\"content\">

".$sqlqueries."</font>";

echo "<BR>";

}

}





Потом открываем: db/mysql.php, находим там функцию:

function sql_query($query = "", $transaction = FALSE)


заменеяем её на:

function sql_query($query = "", $transaction = FALSE) {// Remove any pre-existing queries

unset($this->query_result); if($query != ""){

$time1 = microtime();

$this->query_result = @mysql_query($query, $this->db_connect_id); $time2 = microtime();

$time3= explode(" ",$time1);

$time4= explode(" ",$time2);

$time_result=(float)$time4[1]-(float)$time3[1]+(float)$time4[0]-(float)$time3[0];

$this->all_db+=$time_result; } if($this->query_result) {

$this->num_queries += 1;

$this->text_queries.="<BR>".$query." $time_result";

unset($this->row[$this->query_result]);

unset($this->rowset[$this->query_result]);

return $this->query_result; } else {

return ( $transaction == END_TRANSACTION ) ? true : false; }}




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

ТУТ ТИПА АРХИВЧИГ. - если нету свойства рус нук ставиться в корень сайта

теперь заходим в админ панель и свойства_rus там ставим что показывать или не показывать.

2. Создаем папку config в корневом каталоге. Теперь превратим один

конфигурационный запрос в файлик (открываем mainfile.php):

Находим строки:

$result = $db->sql_query("SELECT * FROM ".$prefix."_config");

$row = $db->sql_fetchrow($result); $sitename = filter($row['sitename'], "nohtml");

-------- // типа много такихже фильтров.....

$copyright = filter($row['copyright']);

$Version_Num = filter($row['Version_Num'], "nohtml");

Перед $result добавим:

if (!file_exists("cache/global.php")) {


После $Version_Num = filter($row['Version_Num'], "nohtml"); надо поставить:

$content1 = "\$version = \"php-nuke(8.1)\";\n";

$content1 .= "\$sitename = \"$sitename\";\n";

$content1 .= "\$nukeurl = \"$nukeurl\";\n";

$content1 .= "\$site_logo = \"$site_logo\";\n";

$content1 .= "\$slogan = \"$slogan\";\n";

$content1 .= "\$startdate = \"$startdate\";\n";

$content1 .= "\$adminmail = \"$adminmail\";\n";

$content1 .= "\$anonpost = \"$anonpost\";\n";

$content1 .= "\$Default_Theme = \"$Default_Theme\";\n";

$content1 .= "\$overwrite_theme = \"$overwrite_theme\";\n";

$content1 .= "\$foot1 = \"$foot1\";\n";

$content1 .= "\$foot2 = \"$foot2\";\n";

$content1 .= "\$foot3 = \"$foot3\";\n";

$content1 .= "\$commentlimit = \"$commentlimit\";\n";

$content1 .= "\$anonpost = \"$anonpost\";\n";

$content1 .= "\$minpass = \"$minpass\";\n";

$content1 .= "\$pollcomm = \"$pollcomm\";\n";

$content1 .= "\$articlecomm = \"$articlecomm\";\n";

$content1 .= "\$broadcast_msg = \"$broadcast_msg\";\n";

$content1 .= "\$my_headlines = \"$my_headlines\";\n";

$content1 .= "\$top = \"$xtop\";\n";

$content1 .= "\$storyhome = \"$storyhome\";\n";

$content1 .= "\$user_news = \"$user_news\";\n";

$content1 .= "\$oldnum = \"$oldnum\";\n";

$content1 .= "\$ultramode = \"$ultramode\";\n";

$content1 .= "\$banners = \"$banners\";\n";

$content1 .= "\$backend_title = \"$backend_title\";\n";

$content1 .= "\$backend_language = \"$backend_language\";\n";

$content1 .= "\$language = \"$language\";\n";

$content1 .= "\$locale = \"$locale\";\n";

$content1 .= "\$multilingual = \"$multilingual\";\n";

$content1 .= "\$useflags = \"$useflags\";\n";

$content1 .= "\$notify = \"$notify\";\n";

$content1 .= "\$notify_email = \"$notify_email\";\n";

$content1 .= "\$notify_subject = \"$notify_subject\";\n";

$content1 .= "\$notify_message = \"$notify_message\";\n";

$content1 .= "\$notify_from = \"$notify_from\";\n";

$content1 .= "\$moderate = \"$moderate\";\n";

$content1 .= "\$admingraphic = \"$admingraphic\";\n";

$content1 .= "\$httpref = \"$httpref\";\n";

$content1 .= "\$httprefmax = \"$httprefmax\";\n";

$content1 .= "\$httprefmode = \"$httprefmode\";\n";

$content1 .= "\$CensorMode = \"$CensorMode\";\n";

$content1 .= "\$CensorReplace = \"$CensorReplace\";\n";

$content1 .= "\$copyright = \"$copyright\";\n";

$content1 .= "\$Version_Num = \"$Version_Num\";\n";

$fo = fopen("config/global.php", 'w+');

$content1 = "<?php\nif (!defined(\"NUKE_FILE\")) die(\"Illegal File Access\");

\n\n".$content1."\n?>";// - 'эту строку после создания файала можно удалить'

fwrite($fo,$content1);

fclose($fo);

unset($content1);

} else {

include('config/global.php');

}




потом после создания config/global.php можно весь текст поменять на:

include('config/global.php');


получиться:



// Error reporting, to be set in config.php

if($display_errors = 1) {

ini_set('display_errors', 1);

error_reporting(E_ALL^E_NOTICE);

} else {

ini_set('display_errors', 0);

error_reporting(0);

}



define('NUKE_FILE', true);

include('config/global.php');

т.е меняем смело всю колонку на: include('config/global.php');

начинается медленно закрадываться сомнение, что это получается ?

было так много?? А стало одна строчка?! Не одна…

добавляем в конец mainfile.php перед ?> :
function save_conf($fp, $content, $type="") {

if (file_exists($fp) && $content) {

$fp = fopen($fp, "w");

$content = (intval($type)) ? "<?php\nif (!defined(\"ADMIN_FILE\"))

die(\"Illegal File Access\");\n\n".$content."\n ?> " : " <?php\n

if (!defined(\"NUKE_FILE\")) die(\"Illegal File Access\"); \n\n ".$content." \n ?>";

fwrite($fp, $content);

fclose($fp);

}

}



Если попытаетесь проверить и посмотреть что получиться то увидите белый экран,

это нормально, т.к все основные переменные должны быть в файле.

Далее открываем

admin/modules/settings.php и смотрим что там за вата такая,

находим:
$row = $db->sql_fetchrow($db->sql_query("SELECT sitename, nukeurl,

site_logo, slogan, startdate, adminmail, anonpost, Default_Theme, foot1,

foot2, foot3, commentlimit, anonymous, minpass, pollcomm, articlecomm,

broadcast_msg, my_headlines, top, storyhome, user_news, oldnum,

ultramode, banners, backend_title, backend_language, language, locale,

multilingual, useflags, notify, notify_email, notify_subject,

notify_message, notify_from, moderate, admingraphic, httpref,

httprefmax, CensorMode, CensorReplace from ".$prefix."_config"));

$sitename = filter($row['sitename'], "nohtml", 0, preview);

--------------- // куча всяких переменных

$httprefmax = intval($row['httprefmax']);

$CensorMode = intval($row['CensorMode']);

$CensorReplace = filter($row['CensorReplace'], "nohtml");




и все это многообразие меняем на:

include("config/global.php");
находим:

case "ConfigSave":

global $prefix, $db, $admin_file;

до строк:

Header("Location: ".$admin_file.".php?op=Configure");

break;


все что между этими строками меняем на:

$content = "\$version = \"php-nuke(8.1)\";\n";

$content .= "\$sitename = \"$xsitename\";\n";

$content .= "\$nukeurl = \"$xnukeurl\";\n";

$content .= "\$site_logo = \"$xsite_logo\";\n";

$content .= "\$slogan = \"$xslogan\";\n";

$content .= "\$startdate = \"$xstartdate\";\n";

$content .= "\$adminmail = \"$xadminmail\";\n";

$content .= "\$anonpost = \"$xanonpost\";\n";

$content .= "\$Default_Theme = \"$xDefault_Theme\";\n";

$content .= "\$overwrite_theme = \"$xoverwrite_theme\";\n";

$content .= "\$foot1 = \"$xfoot1\";\n";

$content .= "\$foot2 = \"$xfoot2\";\n";

$content .= "\$foot3 = \"$xfoot3\";\n";

$content .= "\$commentlimit = \"$xcommentlimit\";\n";

$content .= "\$anonpost = \"$xanonpost\";\n";

$content .= "\$minpass = \"$xminpass\";\n";

$content .= "\$pollcomm = \"$xpollcomm\";\n";

$content .= "\$articlecomm = \"$xarticlecomm\";\n";

$content .= "\$broadcast_msg = \"$xbroadcast_msg\";\n";

$content .= "\$my_headlines = \"$xmy_headlines\";\n";

$content .= "\$top = \"$xtop\";\n";

$content .= "\$storyhome = \"$xstoryhome\";\n";

$content .= "\$user_news = \"$xuser_news\";\n";

$content .= "\$oldnum = \"$xoldnum\";\n";

$content .= "\$ultramode = \"$xultramode\";\n";

$content .= "\$banners = \"$xbanners\";\n";

$content .= "\$backend_title = \"$xbackend_title\";\n";

$content .= "\$backend_language = \"$xbackend_language\";\n";

$content .= "\$language = \"$xlanguage\";\n";

$content .= "\$locale = \"$xlocale\";\n";

$content .= "\$multilingual = \"$xmultilingual\";\n";

$content .= "\$useflags = \"$xuseflags\";\n";

$content .= "\$notify = \"$xnotify\";\n";

$content .= "\$notify_email = \"$xnotify_email\";\n";

$content .= "\$notify_subject = \"$xnotify_subject\";\n";

$content .= "\$notify_message = \"$xnotify_message\";\n";

$content .= "\$notify_from = \"$xnotify_from\";\n";

$content .= "\$moderate = \"$xmoderate\";\n";

$content .= "\$admingraphic = \"$xadmingraphic\";\n";

$content .= "\$httpref = \"$xhttpref\";\n";

$content .= "\$httprefmax = \"$xhttprefmax\";\n";

$content .= "\$httprefmode = \"$xhttprefmode\";\n";

$content .= "\$CensorMode = \"$xCensorMode\";\n";

$content .= "\$CensorReplace = \"$xCensorReplace\";\n";

$content .= "\$copyright = \"$xcopyright\";\n";

$content .= "\$Version_Num = \"$xVersion_Num\";\n";

save_conf("config/global.php", $content);




3. Ну теперь наверное самое простое =).

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

что на свете существует множество серверов со статистикой: рамблер топ, лайфинтернет,

маил, и.д и.п....

открываем файл header.php и комментируем строку: include("includes/counter.php");

4. Модифицируем функцию слежения за пользователем, типа кто присутствует на сайте

и в каком количестве.не будем те адреса котоые ни как не определются.

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

function online() {

global $user, $prefix, $db, $userinfo;

$ip = $_SERVER["REMOTE_ADDR"];

$guest = 0;

$uname = $userinfo['username'];

if (!$uname) {

$uname = "$ip";

$guest = 1;

}

$past = time()-300;

$db->sql_query("DELETE FROM ".$prefix."_session WHERE time < '$past' OR uname='".addslashes($uname)."'");

$ctime = time();

if ($uname!="") {

$uname = substr("$uname", 0,25);

$db->sql_query("INSERT INTO ".$prefix."_session (uname, time, host_addr, guest)

VALUES ('$uname', '$ctime', '$ip', '$guest')");

} $db->sql_freeresult($result);

}

меякм на:

function ip(){

if( getenv('REMOTE_ADDR'))

{$user_ip = getenv('REMOTE_ADDR');}

elseif( getenv('HTTP_FORWARDED_FOR'))

{$user_ip = getenv('HTTP_FORWARDED_FOR');}

elseif( getenv('HTTP_X_FORWARDED_FOR'))

{$user_ip = getenv('HTTP_X_FORWARDED_FOR');}

elseif( getenv('HTTP_X_COMING_FROM'))

{$user_ip = getenv('HTTP_X_COMING_FROM');}

elseif( getenv('HTTP_VIA'))

{$user_ip = getenv('HTTP_VIA');}

elseif( getenv('HTTP_XROXY_CONNECTION'))

{$user_ip = getenv('HTTP_XROXY_CONNECTION');}

elseif( getenv('HTTP_CLIENT_IP'))

{$user_ip = getenv('HTTP_CLIENT_IP');}

else{$user_ip='unknown';}

if(15 < strlen($user_ip)){

$ar = split(', ', $user_ip);

for($i=sizeof($ar)-1; $i > 0; $i--){

if($ar[$i]!='' and !preg_match('/[a-zA-Zа-яА-Я]/', $ar[$i]))

{$user_ip = $ar[$i];

break;

}

if($i==sizeof($ar)-1){$user_ip = 'unknown';}

}

}

if(preg_match('/[a-zA-Zа-яА-Я]/', $user_ip)){$user_ip = 'unknown';}

return $user_ip;

}



function online() {

global $user, $prefix, $db, $userinfo;

$ip = ip();

$guest = 0;

$uname = $userinfo['username'];

if (!$uname) {

$uname = "$ip";

$guest = 1;

}

$past = time()-300;

$db->sql_query("DELETE FROM ".$prefix."_session WHERE time < '$past' OR uname='"

.addslashes($uname)."'");

$ctime = time();

if ($uname!="") {

$uname = substr("$uname", 0,25);

$db->sql_query("INSERT INTO ".$prefix."_session (uname, time, host_addr, guest)

VALUES ('$uname', '$ctime', '$ip', '$guest')");

} $db->sql_freeresult($result);

}

5.Оптимизируем функцию блоков чтоб был 1 запрос

Открываем mainfile.php находим:

function blocks($side) {

global $storynum, $prefix, $multilingual, $currentlang, $db, $admin, $user;

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;

$sql = "SELECT bid, bkey, title, content, url, blockfile, view,

expire, action, subscription FROM ".$prefix."_blocks

WHERE bposition='$pos' AND active='1' $querylang ORDER BY weight ASC";

$result = $db->sql_query($sql);

while($row = $db->sql_fetchrow($result)) {

$bid = intval($row['bid']);

$title = filter($row['title'], "nohtml");

$content = $row['content'];

$url = filter($row['url'], "nohtml");

$blockfile = filter($row['blockfile'], "nohtml");

$view = intval($row['view']);

$expire = intval($row['expire']);

$action = filter($row['action'], "nohtml");

$action = substr($action, 0,1);

$now = time();

$sub = intval($row['subscription']);

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 ($row['bkey'] == "admin") {

adminblock();

} elseif ($row['bkey'] == "userbox") {

userblock();

} elseif (empty($row['bkey'])) {

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);

}

}

}

}

$db->sql_freeresult($result);

}

И польностью её меняем на код который описан ниже.

function crblocks() {

global $db,$prefix,$tableblocks;

$block_info = array();

$sql = "SELECT bid, bkey, title, content, url, blockfile, time, refresh,

view, expire, action, subscription, bposition FROM ".$prefix."_blocks

WHERE active='1' ORDER BY bposition, weight ASC";

$result = $db->sql_query($sql);



while($row = $db->sql_fetchrow($result)) {

// $refresh2 ="";

// $time2 ="";

$bid = intval($row['bid']);

$bkey = filter($row['bkey'], "nohtml");

$title = reg_ex($row['title']);

$content = stripslashes($row['content']);

$url = reg_ex($row['url']);

$blockfile = reg_ex($row['blockfile']);

$view = intval($row['view']);

$expire = intval($row['expire']);

$action = reg_ex($row['action']);

$action = substr($action, 0,1);

$refresh2 = reg_ex($row['refresh']);

$time2 = reg_ex($row['time']);

$now = time();

$sub = intval($row['subscription']);

$side = reg_ex($row['bposition']);

$block_info[] = array('bid'=>$bid, 'bkey'=>$bkey, 'title'=>$title,

'content'=>$content, 'url'=>$url, 'blockfile'=>$blockfile, 'view'=>$view,

'expire'=>$expire, 'action'=>$action, 'subscription'=>$sub,

'refresh'=>$refresh2, 'time'=>$time2, 'side'=>$side);



} $tableblocks = $block_info;

// print_r(array_change_key_case($tableblocks, CASE_UPPER));

$db->sql_freeresult($result);

//die();

}

function blocks($side) {

global $storynum, $prefix, $currentlang, $db, $admin, $user, $tableblocks;

foreach($tableblocks as $v1) {

$side2[0] = strtolower($v1['side']);

$side[0] = strtolower($side);

if ($side2[0] == "$side[0]") {

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 ($sub == 0 OR ($sub == 1 AND !paid())) {

if ($expire != 0 AND $expire <= $now) {

if ($v1['action'] == "d") {

$db->sql_query("UPDATE ".$prefix."_blocks SET active='0', expire='0' WHERE bid='$v1[bid]'");

return;

} elseif ($action == "r") {

$db->sql_query("DELETE FROM ".$prefix."_blocks WHERE bid='$v1[bid]'");

return;

}

}

if ($v1['bkey'] == "admin") {

adminblock();

} elseif ($v1['bkey'] == "userbox") {

userblock();

} elseif (empty($v1['bkey'])) {

if ($v1['view'] == 0) {

render_blocks($v1['side'], $v1['blockfile'], $v1['title'], $v1['content'],

$v1['bid'], $v1['url'], $v1['block_info']);

} elseif ($v1['view'] == 1 AND is_user($user) || is_admin($admin)) {

render_blocks($v1['side'], $v1['blockfile'], $v1['title'], $v1['content'],

$v1['bid'], $v1['url'], $v1['block_info']);

} elseif ($v1['view'] == 2 AND is_admin($admin)) {

render_blocks($v1['side'], $v1['blockfile'], $v1['title'], $v1['content'],

$v1['bid'], $v1['url'], $v1['block_info']);

} elseif ($v1['view'] == 3 AND !is_user($user) || is_admin($admin)) {

render_blocks($v1['side'], $v1['blockfile'], $v1['title'], $v1['content'],

$v1['bid'], $v1['url'], $v1['block_info']);

}



}

}

}

}

}

В том же файле(mainfile.php) после $start_time = $mtime; добавляем

crblocks();

В замен стандартной функции очистки переменных от лишних данных в самый конец

mainfile.php перед ?> добавим:

function reg_ex($str) {

$search = array ("'<script[^>]*?>.*?</script>'si", // Вырезает javaScript

"'<[\/\!]*?[^<>]*?>'si", // Вырезает HTML-теги

"'([\r\n])[\s]+'", // Вырезает пробельные символы

"'&(quot|#34);'i", // Заменяет HTML-сущности

"'&(amp|#38);'i",

"'&(lt|#60);'i",

"'&(gt|#62);'i",

"'&(nbsp|#160);'i",

"'&(iexcl|#161);'i",

"'&(cent|#162);'i",

"'&(pound|#163);'i",

"'&(copy|#169);'i",

"'&#(\d+);'e"); // интерпретировать как php-код



$replace = array ("",

"",

"\\1",

"\"",

"&",

"<",

">",

" ",

chr(161),

chr(162),

chr(163),

chr(169),

"chr(\\1)");



$str = preg_replace($search, $replace, $str);

return $str;

}

6. теперь займемся скоростью работы системы в целом и фильтрацией,

фильтры написаны так что сами заставлябт тупить всю систему

т.к в основном вся фильтрация

идет через функцию fileter модифицируем и её.... для это находим её:

function filter($what, $strip="", $save="", $type="") {

if ($strip == "nohtml") {

$what = check_html($what, $strip);

// $what = htmlentities(trim($what), ENT_QUOTES);

// If the variable $what doesn't comes from a preview screen should be converted

if ($type != "preview" AND $save != 1) {

$what = html_entity_decode($what, ENT_QUOTES);

}

}

if ($save == 1) {

$what = check_words($what);

$what = check_html($what, $strip);

$what = addslashes($what);

} else {

$what = stripslashes(FixQuotes($what,$strip));

$what = check_words($what);

$what = check_html($what, $strip);

}

return($what);

}

ПРиводим функцию к виду:

function filter($what, $strip="", $save="", $type="") {

if ($strip == "nohtml") {

$what = reg_ex($what);

$what = htmlspecialchars(trim($what), ENT_QUOTES, 'cp1251');

// If the variable $what doesn't comes from a preview screen should be converted

if ($type != "preview" AND $save != 1) {

$what = html_entity_decode($what, ENT_QUOTES);

}

}

if ($save == 1) {

$what = check_words($what);

$what = check_html($what, $strip);

$what = addslashes($what);

} else {

$what = stripslashes(FixQuotes($what,$strip));

$what = check_words($what);

$what = check_html($what, $strip);

}

return($what);

}

после строк:

unset($matches);

unset($loc);

if(isset($_SERVER['QUERY_STRING'])) {

if (preg_match("/([OdWo5NIbpuU4V2iJT0n]{5}) /", rawurldecode($loc=$_SERVER['QUERY_STRING']),

$matches)) {

die('Illegal Operation');

}

}




Надо добавить(для того, чтоб если на php выключено добавлние слешей к ",

это делал сам двигатель):

if (!get_magic_quotes_gpc()) {

function add_slashes($value) {

if (is_array($value)) {

$value = array_map("add_slashes", $value);

} elseif (!empty($value) && is_string($value)) {

$value = addslashes($value);

}

return $value;

}

$_GET = add_slashes($_GET);

$_POST = add_slashes($_POST);

$_COOKIE = add_slashes($_COOKIE);

$_REQUEST = add_slashes($_REQUEST);

}

Далее находим эти строчки в том же файле:

if (!defined('ADMIN_FILE')) {

foreach ($_GET as $sec_key => $secvalue) {

if ((eregi("<[^>]*script*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*object*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*iframe*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*applet*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*meta*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*style*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*form*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*img*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*onmouseover*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*body*\"?[^>]*>", $secvalue)) ||

(eregi("\([^>]*\"?[^)]*\)", $secvalue)) ||

(eregi("\"", $secvalue)) ||

(eregi("inside_mod", $sec_key))) {

die ($htmltags);

}

}

foreach ($_POST as $secvalue) {

if ((eregi("<[^>]*onmouseover*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]script*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]*body*\"?[^>]*>", $secvalue)) ||

(eregi("<[^>]style*\"?[^>]*>", $secvalue))) {

die ($htmltags);

}

}

}

За менсто них ставим эти:

if (!defined('ADMIN_FILE')) {

foreach ($_GET as $var_name=>$var_value) {

if (preg_match("/<.*?(script|body|object|iframe|applet|meta|style|form|img|onmouseover).*?>/i",

urldecode($var_value)) || preg_match("/\([^>]*\"?[^)]*\)/", $var_value) ||

preg_match("/\"|\'/", $var_value)) die("HTML in GET - ".$var_name." = ". $var_value."");

if (preg_match("/^(http\:\/\/|ftp\:\/\/|\/\/|https:\/\/|php:\/\/|\/\/)/i", $var_value))

die("URL in GET - ".$var_name." = ". $var_value);

$security_string = "/UNION|OUTFILE|SELECT|ALTER|INSERT|DROP|".$prefix."_admins|".$prefix."_users|ModAdmin|SaveAdmin|EditAdmin|DelAdmin/i";

$security_decode = base64_decode($var_value);

if (preg_match($security_string, $security_decode))

die("Hack base64 in GET - ".$var_name." = ". $var_value."");

if (preg_match($security_string, $var_value)) die("Hack in GET - ".$var_name." = ". $var_value."");

$security_slash = preg_replace("/\/\*.*?\*\//", "", $var_value);

if (preg_match($security_string, $security_slash)) die("Hack in GET - ".$var_name." = ". $var_value."");

}

foreach ($_POST as $var_name=>$var_value) {

if (preg_match("/<.*?(script|body|object|iframe|applet|meta|style|form|onmouseover).*?>/i", urldecode($var_value)))

die("HTML in POST - ".$var_name." = ". $var_value."");

if (preg_match("/^(http\:\/\/|ftp\:\/\/|\/\/|https:\/\/|php:\/\/|\/\/)/i", $var_value))

die("URL in POST - ".$var_name." = ". $var_value);

$security_string = "/UNION|OUTFILE|SELECT|ALTER|INSERT|DROP|".$prefix."_admins|".$prefix."_users|ModAdmin|SaveAdmin|EditAdmin|DelAdmin/i";

$security_decode = base64_decode($var_value);

if (preg_match($security_string, $security_decode))

die("Hack base64 in POST - ".$var_name." = ". $var_value."");

if (preg_match($security_string, $var_value))

die("Hack in POST - ".$var_name." = ". $var_value."");

$security_slash = preg_replace("/\/\*.*?\*\//", "", $var_value);

if (preg_match($security_string, $security_slash))

die("Hack in POST - ".$var_name." = ". $var_value."");

}

}



foreach ($_COOKIE as $var_name=>$var_value) {

if (preg_match("/<.*?(script|body|object|iframe|applet|meta|style|form|img|onmouseover).*?>/i",

$var_value)) die("Hack in COOKIE - ".$var_name." = ". $var_value."");

if (preg_match("/^(http\:\/\/|ftp\:\/\/|\/\/|https:\/\/|php:\/\/|\/\/)/i", $var_value))

die("Hack in COOKIE - ".$var_name." = ". $var_value);

$security_string = "/UNION|OUTFILE|SELECT|ALTER|INSERT|DROP|FROM|WHERE|UPDATE|".$prefix."_admins|"

.$prefix."_users|ModAdmin|SaveAdmin|EditAdmin|DelAdmin/i";

$security_decode = base64_decode($var_value);

if (preg_match($security_string, $security_decode)) die("Hack base64 in COOKIE - ".$var_name." = ". $var_value."");

if (preg_match($security_string, $var_value)) die("Hack in COOKIE - ".$var_name." = ". $var_value."");

$security_slash = preg_replace("/\/\*.*?\*\//", "", $var_value);

if (preg_match($security_string, $security_slash)) die("Hack in COOKIE - ".$var_name." = ". $var_value."");

}



reset($_GET);

reset($_POST);

reset($_COOKIE);

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

имен, кто ломитсья....

7 теперь убирем запрос отвечающий за главную страницу.

открваем admin/modules/modules.php, находим строки:

находим:

echo "<br>";

OpenTable();

echo "<br><center><font class=\"option\">" . _MODULESADDONS . "</font><br><br>"

."<font class=\"content\">" . _MODULESACTIVATION . "</font><br><br>"

."" . _MODULEHOMENOTE . "<br><br>" . _NOTINMENU . "<br><br>"

."<form action=\"".$admin_file.".php\" method=\"post\">"

."<table border=\"1\" align=\"center\" width=\"90%\"><tr><td align=\"center\" bgcolor=\"$bgcolor2\">"

."<b>"._TITLE."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._CUSTOMTITLE."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._STATUS."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._VIEW."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._GROUP."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._FUNCTIONS."</b></td></tr>";

$main_m = $db->sql_fetchrow($db->sql_query("SELECT main_module from " . $prefix . "_main"));

$main_module = $main_m['main_module'];

Меняем на:

echo "<br>";

OpenTable();

echo "<br><center><font class=\"option\">" . _MODULESADDONS . "</font><br><br>"

."<font class=\"content\">" . _MODULESACTIVATION . "</font><br><br>"

."" . _MODULEHOMENOTE . "<br><br>" . _NOTINMENU . "<br><br>"

."<form action=\"".$admin_file.".php\" method=\"post\">"

."<table border=\"1\" align=\"center\" width=\"90%\"><tr><td align=\"center\" bgcolor=\"$bgcolor2\">"

."<b>"._TITLE."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._CUSTOMTITLE."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._STATUS."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._VIEW."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._GROUP."</b></td><td align=\"center\" bgcolor=\"$bgcolor2\">

<b>"._FUNCTIONS."</b></td></tr>";

include('config/module_main.php');

находим:

function home_module($mid, $ok=0) {

global $prefix, $db, $admin_file;

$mid = intval($mid);

if ($ok == 0) {

include ("header.php");

GraphicAdmin();

title("" . _HOMECONFIG . "");

OpenTable();

$row = $db->sql_fetchrow($db->sql_query("SELECT title from " . $prefix . "_modules where mid='$mid'"));

$new_m = filter($row['title'], "nohtml");


удаляем запрос $row2 = $db->sql_fetchrow($db->sql_query("SELECT main_module from " . $prefix . "_main"));

за место него: include('config/module_main.php');

находим:$old_m = filter($row2['main_module'], "nohtml");

заменяем его на: $old_m = filter($main_module, "nohtml");

находим строки:

$row3 = $db->sql_fetchrow($db->sql_query("SELECT title from " . $prefix . "_modules where mid='$mid'"));

$title = filter($row3['title'], "nohtml", 1);

$active = 1;

$view = 0;

$res = $db->sql_query("update " . $prefix . "_main set main_module='$title'");

$res2 = $db->sql_query("update " . $prefix . "_modules set active='$active', view='$view' where mid='$mid'");

Header("Location: ".$admin_file.".php?op=modules");
Их меняем на:

$row3 = $db->sql_fetchrow($db->sql_query("SELECT title from " . $prefix . "_modules where mid='$mid'"));

$title = filter($row3['title'], "nohtml", 1);

$active = 1;

$view = 0;

$content = "\$main_module = \"$title\";\n";

save_conf("config/module_main.php", $content);

$res2 = $db->sql_query("update " . $prefix . "_modules set active='$active', view='$view' where mid='$mid'");

Header("Location: ".$admin_file.".php?op=modules");

Находим:

function module_edit($mid) {

global $prefix, $db, $admin_file;

$main_m = $db->sql_fetchrow($db->sql_query("SELECT main_module from " . $prefix . "_main"));

$main_module = $main_m['main_module'];


Меняем:

function module_edit($mid) {

global $prefix, $db, $admin_file;

include('config/module_main.php');

Открываем файл index.php в корне директории, находим:
$modpath = '';

define('MODULE_FILE', true);

$_SERVER['PHP_SELF'] = "modules.php";

$row = $db->sql_fetchrow($db->sql_query("SELECT main_module from ".$prefix."_main"));

$name = $row['main_module'];

define('HOME_FILE', true);
Заменяем на:

$modpath = '';

define('MODULE_FILE', true);

$_SERVER['PHP_SELF'] = "modules.php";

//$row = $db->sql_fetchrow($db->sql_query("SELECT main_module from ".$prefix."_main"));

include('config/module_main.php');

$name = $main_module;

define('HOME_FILE', true);

теперь в каталоге config создаем файл: module_main.php, при обнавлении страницы будет ошибка,

но после захода в настройку установки стартового модуля, после его сохранения ошибки уйдут.

8. Нужно поработить главное зло системы это вездесуший блок модули.

открываем файл blocks/block-modules.php и меняем его содержимое на это:

<?php

if(!defined('NUKE_FILE')) die('Block wrong call: '.$_SERVER['PHP_SELF']);

global $prefix, $db, $admin, $sape, $sapelink4;

include('config/module_main.php');

$ThemeSel = get_theme();

if (file_exists("themes/$ThemeSel/module.php")) {

include("themes/$ThemeSel/module.php");

if (is_active("$default_module") AND file_exists("modules/$default_module/index.php")) {

$def_module = $default_module;

} else {

$def_module = "";

}

}

if (is_admin($admin)) {

$result2 = $db->sql_query("SELECT title FROM " . $prefix . "_modules");

while ($row2 = $db->sql_fetchrow($result2)) {

$title = stripslashes($row2['title']);

$a = 0;

$handle=opendir('modules');

while ($file = readdir($handle)) {

if ($file == $title) {

$a = 1;

}

}

closedir($handle);

if ($a == 0) {

$db->sql_query("DELETE FROM ".$prefix."_modules WHERE title='$title'");

}

}

}

$content .= "<br/><a href=\"/\"><b>"._HOME."</b></a><br/>";

$result3 = $db->sql_query("SELECT title, custom_title, view FROM " . $prefix . "_modules

WHERE active='1' AND title!='$def_module' AND inmenu='1' ORDER BY custom_title ASC");

while ($row3 = $db->sql_fetchrow($result3)) {

$m_title = stripslashes($row3['title']);

$custom_title = $row3['custom_title'];

$view = intval($row3['view']);

$m_title2 = ereg_replace("_", " ", $m_title);

if ($custom_title != "") {

$m_title2 = $custom_title;

}

if ($m_title != $main_module) {

if ((is_admin($admin) AND $view == 2) OR $view != 2) {

$content .= "<a href=\"modules.php?name=$m_title\" title=\"".$m_title2." \"><b>$m_title2</b></a><br/>";

}

}

}

$content .= "";

if (is_admin($admin)) {

$handle=opendir('modules');

while ($file = readdir($handle)) {

if ( (!ereg("[.]",$file)) ) {

$modlist .= "$file ";

}

}

closedir($handle);

$modlist = explode(" ", $modlist);

sort($modlist);

unset($temp);

$srow4="select title, mid from ".$prefix."_modules";

$res4=$db->sql_query($srow4);

unset($row44);unset($row4);

$row44=array();

while( $row4=$db->sql_fetchrow($res4)) {

$row44[]=$row4[0];

}



$row444=array();

$row444=array_diff($modlist,$row44);

if(!empty($row444))

foreach ($row444 as $k=>$v) {

$mod_uname=str_replace("_"," ",$v);

$db->sql_query("INSERT INTO ".$prefix."_modules VALUES (NULL, '$v', '$mod_uname', '0', '0', '1', '0','')");

}

$content .= "<br><center><b>"._INVISIBLEMODULES."</b><br>";

$content .= "<font class=\"tiny\">"._ACTIVEBUTNOTSEE."</font></center><br>";

$result5 = $db->sql_query("SELECT title, custom_title FROM ".$prefix."_modules

WHERE active='1' AND inmenu='0' ORDER BY title ASC");

while ($row5 = $db->sql_fetchrow($result5)) {

$mn_title = stripslashes($row5['title']);

$custom_title = $row5['custom_title'];

$mn_title2 = ereg_replace("_", " ", $mn_title);

if ($custom_title != "") {

$mn_title2 = $custom_title;

}

if ($mn_title2 != "") {

$content .= "<strong><big>&middot;</big></strong>&nbsp;<a href=\"modules.php?name=$mn_title\">$mn_title2</a><br>\n";

$dummy = 1;

} else {

$a = 1;

}

}

if ($a == 1 AND $dummy != 1) {

$content .= "<strong><big>&middot;</big></strong>&nbsp;<i>"._NONE."</i><br>\n";

}

$content .= "<br><center><b>"._NOACTIVEMODULES."</b><br>";

$content .= "<font class=\"tiny\">"._FORADMINTESTS."</font></center><br>";

$result6 = $db->sql_query("SELECT title, custom_title FROM ".$prefix."_modules



WHERE active='0' ORDER BY title ASC");

while ($row6 = $db->sql_fetchrow($result6)) {

$mn_title = stripslashes($row6['title']);

$custom_title = $row6['custom_title'];

$mn_title2 = ereg_replace("_", " ", $mn_title);

if ($custom_title != "") {

$mn_title2 = $custom_title;

}

if ($mn_title2 != "") {

$content .= "<strong><big>&middot;</big></strong>&nbsp;<a href=\"modules.php?name=$mn_title\">$mn_title2</a><br>\n";

$dummy = 1;

} else {

$a = 1;

}

}

if ($a == 1 AND $dummy != 1) {

$content .= "<strong><big>&middot;</big></strong>&nbsp;<i>"._NONE."</i><br>\n";

}

}

ob_start();

$content .= ob_get_contents();

ob_end_clean();

?>

Промежуточные результаты в режиме гостя имее 51 запрос на главной странице и

время генерации страницы уменьшенное в 5 раз, при стандартных новстях,

голосовании, и + еще какие-то 3 блока. Теперь делаем супер магический ход, отключаем

блок с голосованием, и что мы видим? О чудо! при госте у нас оказывеися 24 запроса! =)



Итак продолжим, теперь перейдем к пользователям:

находим в файле mainfile.php:

function is_admin($admin) {

global $prefix, $db;

if(!is_array($admin)) {

$admin = base64_decode($admin);

$admin = addslashes($admin);

$admin = explode(":", $admin);

$aid = addslashes($admin[0]);

$pwd = "$admin[1]";

} else {

$aid = addslashes($admin[0]);

$pwd = "$admin[1]";

}

if ($aid != "" AND $pwd != "") {

$aid = substr("$aid", 0,25);

$result = $db->sql_query("SELECT pwd FROM ".$prefix."_authors WHERE aid='$aid'");

$row = $db->sql_fetchrow($result);

$pass = $row['pwd'];

if($pass == $pwd && $pass != "") {

return 1;

}

}

return 0;

}

function is_user($user) {

global $prefix, $db, $user_prefix;

if(!is_array($user)) {

$user = base64_decode($user);

$user = addslashes($user);

$user = explode(":", $user);

$uid = "$user[0]";

$pwd = "$user[2]";

} else {

$uid = "$user[0]";

$pwd = "$user[2]";

}

$uid = addslashes($uid);

$uid = intval($uid);

if ($uid != "" AND $pwd != "") {

$result = $db->sql_query("SELECT user_password FROM ".$user_prefix."_users WHERE user_id='$uid'");

$row = $db->sql_fetchrow($result);

$pass = $row['user_password'];

if($pass == $pwd && $pass != "") {

return 1;

}

}

return 0;

}

function is_group($user, $name) {

global $prefix, $db, $user_prefix;

if(!is_array($user)) {

$user = base64_decode($user);

$user = addslashes($user);

$user = explode(":", $user);

$uid = "$user[0]";

$pwd = "$user[2]";

} else {

$uid = "$user[0]";

$uid = intval($uid);

$pwd = "$user[2]";

}

if ($uid != "" AND $pwd != "") {

$result = $db->sql_query("SELECT user_password FROM ".$user_prefix."_users WHERE user_id='$uid'");

$row = $db->sql_fetchrow($result);

$pass = $row['user_password'];

if($pass == $pwd && $pass != "") {

$result2 = $db->sql_query("SELECT points FROM ".$user_prefix."_users WHERE user_id='$uid'");

$row2 = $db->sql_fetchrow($result2);

$points = intval($row2['points']);

$result3 = $db->sql_query("SELECT mod_group FROM ".$prefix."_modules WHERE title='$name'");

$row3 = $db->sql_fetchrow($result3);

$mod_group = $row3['mod_group'];

$result4 = $db->sql_query("SELECT points FROM ".$prefix."_groups WHERE id='$mod_group'");

$row4 = $db->sql_fetchrow($result4);

$grp = intval($row4['points']);

if (($points >= 0 AND $points >= $grp) OR $mod_group == 0) {

return 1;

}

}

}

return 0;

}

Все счастие заменяем на:

function is_admin($admin) {

global $prefix, $db;

if(defined("ADMIN_SET")) return true;

elseif(defined("NOT_ADMIN_SET")) return false;

else{

if(!is_array($admin)) {

$admin = base64_decode($admin);

$admin = addslashes($admin);

$admin = explode(":", $admin);

$aid = addslashes($admin[0]);

$pwd = "$admin[1]";

} else {

$aid = addslashes($admin[0]);

$pwd = "$admin[1]";

}

if ($aid != "" AND $pwd != "") {

$aid = substr("$aid", 0,25);

$result = $db->sql_query("SELECT pwd FROM ".$prefix."_authors WHERE aid='$aid'");

$row = $db->sql_fetchrow($result);

$pass = $row['pwd'];

if($pass == $pwd && $pass != "") {

define("ADMIN_SET", true);

return true;

}

}

define("NOT_ADMIN_SET", true);

return false;

}

}



if(!defined("USER_SET") and !defined("NOT_USER_SET") and $user){

if(!is_array($user)) {

$user_main = base64_decode($user);

$user_main = addslashes($user_main);

$user_main = explode(":", $user_main);

$uid_main = "$user_main[0]";

$pwd_main = "$user_main[2]";

} else {

$uid_main = "$user[0]";

$pwd_main = "$user[2]";

}

$uid_main = addslashes($uid_main);

$uid_main = intval($uid_main);

if ($uid_main != "" AND $pwd_main != "") {

$result_main = $db->sql_query("SELECT * FROM ".$user_prefix."_users WHERE user_id='$uid_main' LIMIT 1");

$userinfo = $db->sql_fetchrow($result_main);

$pass_main = $userinfo['user_password'];

if($pass_main == $pwd_main && $pass_main != "") {

define("USER_SET", true);

}else{

define("NOT_USER_SET", true);

}

}else{

define("NOT_USER_SET", true);

}

}elseif(!defined("USER_SET") and !defined("NOT_USER_SET") and !$user){

define("NOT_USER_SET", true);

}

function is_user($user) {

if(defined("USER_SET")) return true;

if(defined("NOT_USER_SET")) return false;

}

function is_group($user, $name) {

global $prefix, $db, $userinfo, $group_use;

if (is_user($user) and $group_use==1) {

$result = $db->sql_query("SELECT m.mod_group, g.points FROM ".$prefix."_modules AS m LEFT JOIN ".$prefix."_groups AS g ON(g.id=m.mod_group) WHERE m.title='".addslashes($name)."' LIMIT 1");

$group_info = $db->sql_fetchrow($result);

$points = intval($userinfo['points']);

$mod_group = intval($group_info['mod_group']);

$grp = intval($group_info['points']);

if (($points >= 0 AND $points >= $grp) OR $mod_group == 0) {

return 1;

}

}elseif($group_use==0) return 1;

return 0;

}
Получили довольно быстрый способ получения информации является ся ли пользователь пользователем =)

теперь собственно блок пользователя, находим:

function userblock() {

global $user, $cookie, $db, $user_prefix;

if((is_user($user)) AND ($cookie[8])) {

$sql = "SELECT ublock FROM ".$user_prefix."_users WHERE user_id='$cookie[0]'";

$result = $db->sql_query($sql);

$row = $db->sql_fetchrow($result);

$title = ""._MENUFOR." $cookie[1]";

themesidebox($title, $row[ublock]);

}

}

И меняем это за счет полученной переменно в $userinfo

function userblock() {

global $user, $userinfo;

if(is_user($user) and $userinfo['ublockon']==1) {

$title = ""._MENUFOR." ".$userinfo['username'];

themesidebox($title, $userinfo['ublock']);

}

}
Немного поменяем систему работы с банерамы, а то надоело что поисковики говорят,

что баннер отстой, да и сделаю прямые ссылки =) людям не плохи и мне не плохо, зато

подстчет работает без ущерба....



Находим:
function ads($position)

и меняем всю на :

function ads($position) {

global $prefix, $db, $admin, $sitename, $adminmail, $nukeurl, $adsinfo;

$position = intval($position);

if(!is_array($adsinfo) or !$adsinfo){

$adsinfo = array();

$rows = $db->sql_query("SELECT * FROM ".$prefix."_banner WHERE active='1' ORDER BY position");

while($ads_result = $db->sql_fetchrow($rows)){

$adsinfo[$ads_result['position']][$ads_result['bid']] = $ads_result;

}

}

if(!empty($adsinfo[$position])){

$bid = array_rand($adsinfo[$position]);

$now_ads = $adsinfo[$position][$bid];

if(!is_admin($admin)) $db->sql_query("UPDATE ".$prefix."_banner SET impmade=impmade+1 WHERE bid='$bid'");

$imageurl = filter($now_ads['imageurl'], nohtml);

$clickurl = filter($now_ads['clickurl'], nohtml);

$alttext = filter($now_ads['alttext'], nohtml);

$cid = $now_ads['cid'];

$imptotal = intval($now_ads['imptotal']);

$impmade = intval($now_ads['impmade']);

$clicks = intval($now_ads['clicks']);

$date = $now_ads['date'];

$ad_class = filter($now_ads['ad_class'], nohtml);

$ad_code = $now_ads['ad_code'];

$ad_width = intval($now_ads['ad_width']);

$ad_height = intval($now_ads['ad_height']);

/* Check if this impression is the last one and print the banner */

if (($imptotal <= $impmade) AND ($imptotal != 0)) {

$db->sql_query("UPDATE ".$prefix."_banner SET active='0' WHERE bid='$bid'");

$result = $db->sql_query("SELECT name, contact, email FROM ".$prefix."_banner_clients WHERE cid='$cid'");

$row = $db->sql_fetchrow($result);

$c_name = filter($row['name'], nohtml);

$c_contact = filter($row['contact'], nohtml);

$c_email = filter($row['email'], nohtml);

if (!empty($c_email)) {

$from = "$sitename <$adminmail>";

$to = "$c_contact <$c_email>";

$message = _HELLO." $c_contact:\n\n";

$message .= _THISISAUTOMATED."\n\n";

$message .= _THERESULTS."\n\n";

$message .= _TOTALIMPRESSIONS." $imptotal\n";

$message .= _CLICKSRECEIVED." $clicks\n";

$message .= _IMAGEURL." $imageurl\n";

$message .= _CLICKURL." $clickurl\n";

$message .= _ALTERNATETEXT." $alttext\n\n";

$message .= _HOPEYOULIKED."\n\n";

$message .= _THANKSUPPORT."\n\n";

$message .= "- $sitename "._TEAM."\n";

$message .= "$nukeurl";

$subject = "$sitename: "._BANNERSFINNISHED."";

mail($to, $subject, $message, "From: $from\nX-Mailer: PHP/" . phpversion());

}

}

if ($ad_class == "code") {

$ad_code = stripslashes(FixQuotes($ad_code));

$ads = "<center>$ad_code</center>";

} elseif ($ad_class == "flash") {

$ads = "<center>

<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"

codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0\"

WIDTH=\"$ad_width\" HEIGHT=\"$ad_height\" id=\"$bid\">

<PARAM NAME=movie VALUE=\"$imageurl\">

<PARAM NAME=quality VALUE=high>

<EMBED src=\"$imageurl\" quality=high WIDTH=\"$ad_width\" HEIGHT=\"$ad_height\"

NAME=\"$bid\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\"

PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\">

</EMBED>

</OBJECT>

</center>";

} else {

$ads = "<center><a href=\"".$clickurl."\" onClick=\"this.href='index.php?op=ad_click&amp;bid=".$bid."'\" target=\"_blank\"><img src=\"".$imageurl."\" border=\"0\" title=\"".$alttext."\"/></a></center>";

}

} else {

$ads = "";

}

return $ads;

}

Так прикольно, сразу вылезло что кто сидит на таг. через php-nuke является рефералом

твердого Михаила =)


9.теперь разбиремся c модулем узер инфо! ура! дошел всетака, уже 2 часа пишу эту хрень

немножко подустал, ну ладно, двигаемся...

в mainfile.php После закрывающей скобки function online() {}



добавляем функцию:

function online_robots($useragent) {

global $r_or;

$r_or=false;



# Выясняем принадлежность к поисковым роботам

$remap_agents = array (

'antabot' => 'antabot (private)',

'aport' => 'Aport',

'Ask Jeeves' => 'Ask Jeeves',

'Asterias' => 'Singingfish Spider',

'Baiduspider' => 'Baidu Spider',

'Feedfetcher-Google'=> 'Feedfetcher-Google',

'GameSpyHTTP' => 'GameSpy HTTP',

'GigaBlast' => 'GigaBlast',

'Gigabot' => 'Gigabot',

'Accoona' => 'Google.com',

'Googlebot-Image' => 'Googlebot-Image',

'Googlebot' => 'Googlebot',

'grub-client' => 'Grub',

'gsa-crawler' => 'Google Search Appliance',

'Slurp' => 'Inktomi Spider',

'slurp@inktomi' => 'Hot Bot',



'lycos' => 'Lycos.com',

'whatuseek' => 'What You Seek',

'ia_archiver' => 'Alexa',

'is_archiver' => 'Archive.org',

'archive_org' => 'Archive.org',



'YandexBlog' => 'YandexBlog',

'YandexSomething' => 'YandexSomething',

'Yandex' => 'Yandex',

'StackRambler' => 'Rambler',



'WebAlta Crawler' => 'WebAlta Crawler',

'igdeSpyder' => 'igdeSpyder',

'Yahoo' => 'Yahoo',

'zyborg@looksmart' => 'WiseNut',

'WebCrawler' => 'Fast',

'Openbot' => 'Openfind',

'TurtleScanner' => 'Turtle',

'libwww' => 'Punto',



'msnbot' => 'MSN',

'MnoGoSearch' => 'mnoGoSearch',

'booch' => 'booch_Bot',

'WebZIP' => 'WebZIP',

'GetSmart' => 'GetSmart',

'NaverBot' => 'NaverBot',

'Vampire' => 'Net_Vampire',

'ZipppBot' => 'ZipppBot',

'Begun' => 'Begun Robot Crawler',

'W3C_Validator' => 'W3C Validator',

'W3C_CSS_Validator' => 'W3C CSS Validator',

);



$remap_agents=array_change_key_case($remap_agents, CASE_LOWER);



$pmatch_agents="";

foreach ($remap_agents as $k => $v) {

$pmatch_agents.=$k."|";

}

$pmatch_agents=substr_replace($pmatch_agents, '', strlen($pmatch_agents)-1, 1);



if (preg_match( '/('.$pmatch_agents.')/i', $useragent, $match ))



if (count($match)) {

$r_or = @$remap_agents[strtolower($match[1])];

}



return $r_or;

}

и функцию:

function online_skip($text) {

$text=mysql_escape_string($text);

$text=stripslashes($text);

$text = str_replace("'",'`',$text);

$text = str_replace('"','`',$text);

return $text;

}




открываем blocks/block-User_Info.php

и его содержимое меняем на это:

<?php

if ( !defined('BLOCK_FILE') ) {

Header("Location: ../index.php");

die();

}

$bots ="";

$content = "";

global $user, $prefix, $user_prefix, $db, $anonymous, $locale, $location;

$month = date('M');

$curDate2 = "%".$month[0].$month[1].$month[2]."%".date('d')."%".date('Y')."%";

$ty = time() - 300;

$preday = strftime('%d', $ty);

$premonth = strftime('%B', $ty);

$preyear = strftime('%Y', $ty);

$curDateP = "%".$premonth[0].$premonth[1].$premonth[2]."%".$preday."%".$preyear."%";

$who_online_now = ""; $guest_online_now = "";

$online_sql = "SELECT * FROM ".$prefix."_session";

$online_query = $db->sql_query($online_sql); $i = 1;

while ($online_row = $db->sql_fetchrow($online_query)){

$current_robot = online_skip(online_robots($online_row[useragent]));

if ($current_robot!="") {

if (is_admin($admin)) { $rt=filter($online_row['location'], "");}

$bots .= "<font color=red>$current_robot</font> $rt <br>"; $f++;

} else {

if (isset($online_row[guest]) and $online_row[guest] == 0) {

if ($i < 10) { $a++;

$who_online_now .= "0" .$i." :&nbsp;<a href=\"modules.php?name=Your_Account&amp;op=userinfo&amp;username=$online_row[uname]\"><font color=\"#3572AD\">$online_row[uname]</font></a><br>\n";

} else {$a++;

$who_online_now .= $i.":&nbsp;<a href=\"modules.php?name=Your_Account&amp;op=userinfo&amp;username=$online_row[uname]\"><font color=\"#3572AD\">$online_row[uname]</font></a> $online_row[location]<br>\n";

}

$who_online_now .= ($i != $member_online_num ? " " : "");

$i++;

} else {$b++;

if (is_admin($admin)) { $guest_online_now .= " ".$online_row['location']."<br>\n";}

}

}

$hala="";

}

if ($f == 0) {$f=0;}

if ($a == 0) {$member_online_num = 0;} else {$member_online_num = $a;}

if ($b == 0) {$guest_online_num = 0;} else {$guest_online_num = $b;}

$who_online_num = $guest_online_num + $member_online_num + $f;

$who_online_num = intval($who_online_num);



$botes = $who_online_num-$guest_online_num-$member_online_num;

$content .= "<img src=\"images/blocks/group-3.gif\" height=\"16\" width=\"16\" alt='"._BVISIT."' /> <b><u>"._BVISIT.":</u></b>\n<br>\n";

$content .= "<img src=\"images/blocks/ur-anony.gif\" height=\"16\" width=\"16\" alt='"._BVIS."' /> "._BVIS.": <b>$guest_online_num</b><br>\n";

$content .= "<img src=\"images/blocks/ur-member.gif\" height=\"16\" width=\"16\" alt='Зарегистрированные пользователи'/> Зарегестрированных пользователей: <b>$member_online_num</b><br>\n";

$content .= "<img src=\"images/blocks/ur-registered.gif\" height=\"16\" width=\"16\" alt='"._BTT."'/> "._BTT.": <b>$who_online_num</b> из них роботов:<b>$botes</b> <br>\n $hala";

if (is_admin($admin)) {if ($bots !="") {

$content .= "<hr><img src=\"images/blocks/group-2.gif\" height=\"16\" width=\"16\" alt='Поисковые системы'/> <b><u>Боты на линии:</u></b><br>$bots";

}

}



if ($member_online_num > 0) {

$content .= "<hr>\n<img src=\"images/blocks/group-1.gif\" height=\"16\" width=\"16\" alt='"._BON."'/> <b><u>"._BON.":</u></b><br>$who_online_now";

}



?>

Реккомендую этот блок поставить за место родного кто на сайте, он делает один

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



Вот теперь у нас гостевой предел запросов на главной = 19 и 0.1 секунда открытия

страницы, уже ощущается, что сайт преобразовался из тяжелого ольшого слабого

(относительно размера) мутанта в не что меньшее и быстрое.


Ну а теперь последние 3 дополнения и я наконец лягу спать....


10.так модифицируем admin.php, посмотрев дикие запросы в бд при адимнистрировании,

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

в системе, по этому поводу, находим:

$handle=opendir('modules');

$modlist = "";

while ($file = readdir($handle)) {

if ( (!ereg("[.]",$file)) ) {

$modlist .= "$file ";

}

}

closedir($handle);

$modlist = explode(" ", $modlist);

sort($modlist);

for ($i=0; $i < sizeof($modlist); $i++) {

if(!empty($modlist[$i])) {

$row = $db->sql_fetchrow($db->sql_query("SELECT mid from " . $prefix . "_modules where title='$modlist[$i]'"));

$mid = intval($row['mid']);

if (empty($mid)) {

$db->sql_query("insert into " . $prefix . "_modules values (NULL, '$modlist[$i]', '$modlist[$i]', '0', '0', '1', '0', '')");

}

}

}


и это комменитруем, далее заходим в папку admin/modules, созаем в ней файл modup.php,

в него вставляем:

<?php



if (!defined('ADMIN_FILE')) {

die ("Access Denied");

}



global $prefix, $db, $admin_file;

$aid = substr("$aid", 0,25);

$row = $db->sql_fetchrow($db->sql_query("SELECT radminsuper FROM " . $prefix . "_authors WHERE aid='$aid'"));

if ($row['radminsuper'] == 1) {



function main_mod() {

global $db, $bgcolor2, $admin_file, $prefix;

include ("header.php");

GraphicAdmin();

OpenTable();

echo "<center><font class=\"title\"><b>Обновление модулей</b></font></center>";

CloseTable();

echo "<br>";



$handle=opendir('./modules');

$modlist = "";

while ($file = readdir($handle)) {

if ( (!ereg("[.]",$file)) ) {

$modlist .= "$file ";

}

}

closedir($handle);

$modlist = explode(" ", $modlist);

sort($modlist);

for ($i=0; $i < sizeof($modlist); $i++) {

if(!empty($modlist[$i])) {

$row = $db->sql_fetchrow($db->sql_query("SELECT mid from " . $prefix . "_modules where title='$modlist[$i]'"));

$mid = intval($row['mid']);

if (empty($mid)) {

$db->sql_query("INSERT INTO modules values (NULL, '$modlist[$i]', '$modlist[$i]', '0', '0', '1', '0', '')");

}

}

}

include("footer.php");

}



switch($op) {



case "modup":

main_mod();

break;



}



} else {

echo "Access Denied";

}



?>

потом заходим в папку admin/links тут создаем файл links.modup.php

в него помещаем:

<?php

if (!defined('ADMIN_FILE')) {

die ("Access Denied");

}



global $admin_file;

if ($radminsuper==1) {

adminmenu("".$admin_file.".php?op=modup", "Обновление модулей", "preferences.gif");

}



?>

и наконец admin/case создаем файл case.modup.php

и в него вставляем:

<?php

if (!defined('ADMIN_FILE')) {

die ("Access Denied");

}



switch($op) {

case "modup":

include("admin/modules/modup.php");

break;



}

?>
все имеем у админа на тойже главной странице 34 запроса =) поздравляю управленческий

тюнинг почти закончен.



11. открываем includes/ipban.php, находим:

$numrow = $db->sql_numrows($db->sql_query("SELECT id FROM ".$prefix."_banned_ip WHERE ip_address='$ip'"));

if ($numrow != 0) {

echo "<br><br><center><img src='images/admin/ipban.gif'><br><br><b>You has been banned by the administrator</b></center>";

die();

}

$ip_class = explode(".", $ip);

$ip = "$ip_class[0].$ip_class[1].$ip_class[2].*";

$row = $db->sql_fetchrow($db->sql_query("SELECT ip_address FROM ".$prefix."_banned_ip WHERE ip_address='$ip'"));

$ip_class_banned = explode(".", $row[ip_address]);

if ($ip_class_banned[3] == "*") {

if ($ip_class[0] == $ip_class_banned[0] && $ip_class[1] == $ip_class_banned[1] && $ip_class[2] == $ip_class_banned[2]) {

echo "<br><br><center><img src='images/admin/ipban.gif'><br><br><b>You has been banned by the administrator</b></center>";

die();

}

}

Меняем это на:

$ip_class = explode(".", $ip);

$ip2 = "$ip_class[0].$ip_class[1].$ip_class[2].*";

//ADD

$numrow = $db->sql_numrows($db->sql_query("SELECT id FROM ".$prefix."_banned_ip WHERE ip_address='$ip' OR ip_address='$ip2'"));

if ($numrow != 0) {

echo "<br><br><center><img src='images/admin/ipban.gif'><br><br><b>You has been banned by the administrator</b></center>";

die();

}

в этом же файле находим:

$ip = $_SERVER['REMOTE_ADDR'];

$past = time()-2;

$sql = "DELETE FROM ".$prefix."_antiflood WHERE time < '$past'";

$db->sql_query($sql);

$ctime = time();

$db->sql_query("INSERT INTO ".$prefix."_antiflood (ip_addr, time) VALUES ('$ip', '$ctime')");

$numrow = $db->sql_numrows($db->sql_query("SELECT * FROM ".$prefix."_antiflood WHERE ip_addr='$ip'"));

if ($numrow >= 3) {

echo "<br><br><center><b>Sorry, too many page loads in so little time!</b></center>";

die();

}

unset($ip);


и заменяем на:

if ($antiflood_pages>0) {

$ip = $_SERVER['REMOTE_ADDR'];

$past = time()-2;

$sql = "DELETE FROM ".$prefix."_antiflood WHERE time < '$past'";

$db->sql_query($sql);

$ctime = time();

$db->sql_query("INSERT INTO ".$prefix."_antiflood (ip_addr, time) VALUES ('$ip', '$ctime')");

$numrow = $db->sql_numrows($db->sql_query("SELECT * FROM ".$prefix."_antiflood WHERE ip_addr='$ip'"));

if ($numrow >= $antiflood_pages) {

echo "<br><br><center><b>Извините, но Вы открываете слишком много страниц за малый промежуток времени!</b></center>";

die();

}

unset($ip);

}

так теперь у гостя 18 запросов. если отключить антифлуд, который меня лично бесит,

то будет 15 запросов, у админа гд-то 34-36

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

ну новости какие разместят, одного часа хватит ведь =) ... короче в кеш его! Но!

Сначало его зажмем.

открываем mainfile.php и туда перед функцией function makePass вставляем:


function CheckCanGzip(){

if (headers_sent() || connection_aborted()){

return 0;

}

if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'x-gzip') !== false) return "x-gzip";

if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) return "gzip";

return 0;

}



/* $level = compression level 0-9, 0=none, 9=max */

function GzipOut($debug=0, $level=1){

global $config, $Timer, $db, $tpl, $Size, $Crc, $s;

header ("Last-Modified: " . date('r', time()-60*60*10) ." GMT");

$ENCODING = CheckCanGzip();

if ($ENCODING){

$Contents = ob_get_contents();

ob_end_clean();

if ($debug){

$s = "<!--Несжатая: ".strlen($Contents)."; ";

$s .= "Сжатая: ".

strlen(gzcompress($Contents, $level)).

"-->";

$Contents .= $s;

}

header("Content-Encoding: $ENCODING");

print "\x1f\x8b\x08\x00\x00\x00\x00\x00";

$Size = strlen($Contents);

$Crc = crc32($Contents);

$Contents = gzcompress($Contents, $level);

$Contents = substr($Contents, 0, strlen($Contents) - 4);

print $Contents;

print pack('V', $Crc);

print pack('V', $Size);

exit;

}else{

ob_end_flush();

if ($debug){

echo "<!--Страница не была сжата-->";

}

exit;

}



}


находим в mainfil.php строики:



if ($phpver >= '4.0.4pl1' && isset($_SERVER['HTTP_USER_AGENT']) && strstr($_SERVER['HTTP_USER_AGENT'],'compatible')) {

if (extension_loaded('zlib')) {

@ob_end_clean();

ob_start('ob_gzhandler');

}

} elseif ($phpver > '4.0' && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && !empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {

if (strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) {

if (extension_loaded('zlib')) {

$do_gzip_compress = true;

ob_start(array('ob_gzhandler',5));

ob_implicit_flush(0);

if (ereg("MSIE", $_SERVER['HTTP_USER_AGENT'])) {

header('Content-Encoding: gzip');

}

}

}

}

и удаляем их чтоб не мешали работать.

Открываем файл header.php и туда добавляем:

после define('NUKE_HEADER', true);

данные буковки:

ob_start();

ob_implicit_flush(0);

Открываем footer.php находим строки:

echo "</body>\n</html>";

ob_end_flush();

die();

}



foot();

и меняем их на:

echo "</body>\n</html>";

}



foot();

GzipOut(true,"5");

die();
Ну вот собственно получили довольно приличный нук, похожий чем-то на smallNuke,

так теперь прикиним теоретически, что если к сайту будут ходить человек эдак 30-40 в сутки,

это же мало =) и соответственно он будет работать нормально и относительно быстро,

теперь если вы развились, понавешали кучу блоков и всякой интересной и уникальной

информации, нужно будет думать чтот с этим делать, это надо кешировать.

мда полазив по сайту понял что меня конкретно бесит антифлуд...

Вот, финальные размышления, если заменить модуль NEWS на какой-нибудь менее запросливый,

и поставить модуль ajax голосования, то можно впринципе еще уменьшить запросы т.к основная нагрузка идет именно от него,

не оптимизировано практически ничего и скорее всего сам автор этого делать не будет,

поэтому система PHP-Nuke так и останется отличным материалом для изучения для тех,

кто не особо разбирается в PHP, потому-что с нее многие начали и взяли кучу элементов,

например Slaed, Post Nuke, smallNuke..... это конечно не полный список, но эту систему можно отлично

манетизоровать(естественно уже оптимизированную, а то многие просто могут отказаться оказываеть услуги хостинга,

хотя в наше время эта CMS не является такой мега нагружающей систему как многие пишут

да и компьютеры уже давно не пентиумы 166ММХ)

если надо че написать пишите поможем чем сможем....

Во нашел кусочки от наворотов http://mynuke.ru
великий человек много написал, там кстате есть оптимизация модуля новостей....
Самописные содули еще есть тут и вот тут так что ищите.....

забыл совсем, что не выложил собраный архив с данными модификациями...

2 комментария:

Анонимный комментирует...

Приветствую! Спасибо за статью!
Возникла проблема по п. 5, после вышеизложенных манипуляций блоки перестают отображаться. В описание не совсем ясна фраза, тут, имхо, явно чего то не хватает?

В том же файле(mainfile.php) после $start_time = $mtime; добавляем
В замен стандартной функции очистки переменных от лишних данных в самый конец
mainfile.php перед ?> добавим:

ADRE комментирует...

Когда тексты набираешь глюки бывают, вот думал об одном, напячатал другое, потом быстро скинул.

после $start_time = $mtime; добавляем

crblocks();

забыл написать =)))

Тык Тык UpToLike