когда подумал о создании сайта, люди посоветовали: ты что будешь писать сайт сам?
Ну ты дурак, есть же готовые сайты 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() {В том же файле(mainfile.php) после $start_time = $mtime; добавляем
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']);
}
}
}
}
}
}
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>·</big></strong> <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>·</big></strong> <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>·</big></strong> <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>·</big></strong> <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&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." : <a href=\"modules.php?name=Your_Account&op=userinfo&username=$online_row[uname]\"><font color=\"#3572AD\">$online_row[uname]</font></a><br>\n";
} else {$a++;
$who_online_now .= $i.": <a href=\"modules.php?name=Your_Account&op=userinfo&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все имеем у админа на тойже главной странице 34 запроса =) поздравляю управленческий
if (!defined('ADMIN_FILE')) {
die ("Access Denied");
}
switch($op) {
case "modup":
include("admin/modules/modup.php");
break;
}
?>
тюнинг почти закончен.
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>";Ну вот собственно получили довольно приличный нук, похожий чем-то на smallNuke,
}
foot();
GzipOut(true,"5");
die();
так теперь прикиним теоретически, что если к сайту будут ходить человек эдак 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 перед ?> добавим:
Когда тексты набираешь глюки бывают, вот думал об одном, напячатал другое, потом быстро скинул.
после $start_time = $mtime; добавляем
crblocks();
забыл написать =)))
Отправить комментарий