среда, 30 июля 2008 г.

Чтобы не забыть, где что брать....

Буду окучивать wordpress, вчера покопавшись в его запутанных функциях понял что его походу писало человек 15 или 1 с разчетвиренем личности.

Полезные ссылки для WORDPRESS:
http://hokdes.ru/wordpress/ - Туча ссылок на плагины иразные приблуды

http://mashable.com - более трехсот приблуд но EN

Если все это счастие перелапатить, то можно собрать: блог своей мечты, чисто новостной сайт со всеми возможностями блога, т.к новостные сайты нынче тухленкие, то их это сильно оживит, только дизайн надо будет переделать немножко =)

+ ко всему Большой колющийся .... =) переводчик Press,а

Заметки по ВОРД прессу

Впринципе есть много что почитать для понимания работы, но в глазах рябит от количества букв на фоне.... незнаю, если этот человек правит все текста в блокноте или "ее" редакторе то он просто псих.

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

вторник, 29 июля 2008 г.

1ps

пришел с утрица на работу и в данном сервисе накидал ссылок в разные каталоги, что - то эффекта с 1ps не наблюдаюется(естественно не с сайта который утром был туда внесен, а который постился 2 месяца назад яндекс из 1500 каталогов видит только 15 )))), когда поместил адский листок к себе на сайт яша его скушал и выплюнул все страницы из индекса, что за хрень... пойду курну немного winston lite 3 калории ......

По поводу SeO

Думал... потом еще думал.... что же написать, впринципе тем то, о которых хотелось написать много, но почему-то так лень....
Мда оптимизация конечно хорошо, многие увлекаются, и получается действительно вата, на которую не кто не ходит, а потом и в конце концов вообщее никто не ходит, даже роботы, так вот. Всетаки гуглисты были правы: создавайте сайты для людей... и типа все будет хорошо просто замечательно... надеюсь всетаки переборю лень и послезавтра выложу Дьявольскую смесь которая называется автоматическое наполнение сайта -) или проще говоря автосайт для привлечения посетителей без лишних усилий.

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



а это ---------------------------->
такая нормальная погодка =)
Автодору надо по самые гланды вставить за то что нихера в течении 4 лет не придумали. каждый год такая порнография

понедельник, 28 июля 2008 г.

Как заработать на траффике или конвертируем китайцев и дойчландеров в монету.

Как заработать на траффике или конвертируем китайцев и дойчландеров в монету.

На самом деле все началось с того, что начальство решило посмотреть что же такое
счетчик посещений, незнаю на какие ресурсы оно решило сходить (хотя на самом
деле знаю =)) и заявило: "мне интересно знать с каких компьютеров заходят
пользователи", будучи сильно ленивым, спросил, вам нужны характеристики компьтеров?
их частота процессора? видеокарта и объем памяти? =)). Естественно получил,
странно вразумительный ответ: "Из каких городов к нам приходят на сайт? По каким
поисковым запросам нас находят?". Тут у меня настало шоковое состояние, как-то
не охото в пятницу вечером что ли бо делать, да и вообще делать на ПК - ДОСТАЛО
В КОНЕЦ.

До конца рабочего дня шефа оставалось минут 30, пришлось искать методы быстрого
решения "проблеммы". Зайдя в Гугл по запросу: "базы IP по городам России", найдены
были какие-то странно дешевые, аля работающие! и востребованные базы сомнительного
содержания, не раз приходилось покупать в инете дешевые, от производителя,
китайские корпуса для сотовых телефонов....

Благо в интернете существуют места где люди всетаки как-то общаются на адекватные
темы, было найдено 2 каталога IP адресов, один по странам, другой по городам России.
По городам России http://ip2city.ru/ , не знаю на сколько адекватные, но сравнивать
не счем было. Прикрутил к 2ух месячной статистике, построил круговую диаграмму
Шефа сразу обрадовалась... и потом ничего не говорила....

Увидев существования Базы по странам (http://ip-to-country.webhosting.info/)
в душу заползло что-то не понятное, тыкая
сонно в чуже блоги обнаружил на одном из них Добрую Контору, клавиша демо
меня порадовала. Полез смотреть статистику,
какой же очередной алень решил отправить заявление о том как же мы не правильно
работаем. Оказалось что это не алень а китаец =). Чего тебе надобно страче...

И его IP в банлисте. через 5 минут пришло еще 5 китайцев с разными IP, хотя может
это и не китайцы вовсе были, смотрю бан лист растет, уже превратился в целую подсеть.

Мысль мгновенно пролетала и оставила веселый осадок, денежный банный лист - просто
замечательно, китайцам явно нечего делать на русском гос. сервере. В понедельник
уже используя базу ip-to-country и ключевые porno, lesbos англицкие слова, для Yahoo,
соорудил забавный бан лист, для всех инакоязычных Ip адрессов, Yahoo довольно кушал
бан контент, а вот посетителей ждал сюрприз при движении мышкой над данным листом
(вспоминая дыры БК). Контора хорошая, если попал
к ним, то держит крепко на сколько возможно. И китайцы рады и мне забавно.

Ближе к делу.

Сначало нам ведь надо понять действительно ли человек пришел не из россии или
хотябы СНГ, ну т.е понять понимает ли он буковки на кириллице,
для этого надо определить его местонахождение по IP адресу, естественно что
если он пришел через прокси, то его тоже направит туда же куда мы захотим,
но подумав и ответив на вопрос: зачем человек заходит на сайт через прокси сервер?
нормальный человек не будет шифроваться и скрывать свой IP ну незачем ему это,
для него главная цель - найти инормацию или просто посмотреть веселые картинки.

Ну да ладно.

0,95 ШАГ .для этого регистрируемся в Конторе

1 ШАГ.

Нужно взять более менне свежие базы IP адресов, а то окажется что соседа по
дому слил добрым дядькам =)... идем и качаем CVS файл .

2 ШАГ. если хостинГ или это

позволяет использовать PHP + MySQL, то создаем там таблицу вида
(это для файлика all_networks.csv) качать с сайта: http://ip2city.ru/

CREATE TABLE `ip2city_networks` (
`CountryCode` char(2) NOT NULL default '',
`CityID` int(5) NOT NULL default '0',
`IPFrom` double NOT NULL default '0',
`IPTo` double NOT NULL default '0',
`NetName` varchar(75) NOT NULL default '',
KEY `Code` (`IPFrom`,`IPTo`)
);

3 ШАГ создали? Хорошо. Теперь нужно импоритровать скачанный нами файл в нашу табличку:
выполняем sql запрос:

LOAD DATA INFILE '/home/all_netwoks.csv' INTO TABLE `ip2city_networks`
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

Краткое описание: /home/all_netwoks.csv - это естественно путь где лежит наш
файл, INTO TABLE `ip2city_networks` - вставить в такую-то таблицу данные,
линии разделяются переносом строки.

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

$sql = 'SELECT CountryCode, CityID, NetName
FROM `ip2city_networks`
WHERE (`IPFrom` < '.$ip_num.') AND ('.$ip_num.'< `IPTo`)';

можно выковыривать оттуда нужные значения... теперь рассмотрим для крутого справочника значений IP 'Это у нас ip-to-country.csv' для него нужно создать немножко другую базу, чтобы в голове ничего не перепуталось названия значений у таблицы будут примерно одинаковые:

CREATE TABLE `ip2w_n`
( `IPFrom` double NOT NULL default '0',
`IPTo` double NOT NULL default '0',
`CountryCode` char(2) NOT NULL default '',
`CityID` char(5) NOT NULL default '0',
`Gos` varchar(75) NOT NULL default '',
KEY `Code` (`IPFrom`,`IPTo`) );

Так вот теперь у нас получилось, табличка, надо засунуть в нее значения. делаем запрос вида: качать с сайта http://ip-to-country.webhosting.info/:

LOAD DATA INFILE '/home/ip-to-country.csv' INTO TABLE `ip2w_n` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

т.к впринципе оба csv файла одинаково скомпановыны, то импорт тоже похож и запрос в БД впринципе тоже похож...

Получилось, что у нас в БД лежат какие-то цыфры с буквами, не все так страшно как мне кажется =)....

Так, надо наверно это куда-то встроить, и помочь добрым китайцам или великой америке получать немножко добра, они любит всякие такие штуки радостные. Т.к лень двигатель прогресса и в данный момент изучать ничего нового не охото будем встраивать в нюку, если есть пожелания встроить это куда-то в другое место пишите... 2.1 ШАГ.... Создание мега коварного тестового блока по захвату вселенной т.к блок - удобный инструмент.... допустим у вас есть блок с какой-нибудь информацией для посетителей или просто реклама, да на самом деле не важно, можно даже и в тело главно скрипта,пусть даже навигация.... создаем файлик: block-dieUSA.php в него запишем: <?php



if (eregi("block-dieUSA.php",$_SERVER['PHP_SELF'])) {

Header("Location: index.php");

die();

}

global $db;

if($result = $db->sql_query("SELECT Gos FROM `ip2w_n`

WHERE (`IPFrom` <= ".ip2long($_SERVER['REMOTE_ADDR']).")

AND (".ip2long($_SERVER['REMOTE_ADDR'])."<= `IPTo`)"))

{

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

$content = $row['Gos']."тут есть какая-то чтука"; //наеюсь понятно куда писать магические коды для системы =)

}$db->sql_freeresult($result);} else {$content = "запрос не удался!";}

?>

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

Так теперь модифицируем код для определения присутствия нужного поискового робота:<?php



if (eregi("block-dieUSA.php",$_SERVER['PHP_SELF'])) {

Header("Location: index.php");

die();

}

global $db;

$userag = online_robots(online_skip($_SERVER['HTTP_USER_AGENT']));

if ($userag =="") {

if($result = $db->sql_query("SELECT Gos FROM `ip2w_n` WHERE

(`IPFrom` <= ".sprintf("%u",ip2long($_SERVER['REMOTE_ADDR'])).") AND

(".sprintf("%u",ip2long($_SERVER['REMOTE_ADDR']))."<= `IPTo`)"))

{

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

$content = $row['Gos']."";

}$db->sql_freeresult($result);} else {$content = "запрос не удался!";}

} else {$content ="Какой-нибудь ваш добрый контент для робота";}

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;

}

?>

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

Подобным планом можно подсовывать забугорным ребятам всё, что угодно.
Если отойти от Базы Данных, то можно приспособить естественно функцию и для того,
чтоб сайты своей компании работали на SAPE и LINKFEED, конечно будет немного
нарушение правила размещения ссылок, но все равно на сайте приличной компании
директор смотрит, что находиться на сайте и не даст их размещать =).

Если у сайта маленький тИЦ и PR, то тоже нет смысла иметь скрытые ссылки,
в моей конторе тИЦ - 1800 - не много конечно,
но моим сайтам почему-то дал прирост в 50 тИЦ не ясно почему так много, не волнуйтесь
эти сайты никуда не выкладывал и не кто не знает кто ими правит =)))

ВЫВОДЫ: Поставленная задача была решина в полном объеме и весь драгоценный
забугорный траффик будет перенаправлен на нужную нам страницу.
В принциепе данным методом можно встроить в любую CMS, главное знать метод
формирования. Ну и собственно можно в блок и не встраивать, а в само тело CMS.
Это уже на ваше усмотрение.

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

Сам процесс выборки довольно весомый, время запроса к БД вырастает в 10 раз,
если сайт размещать на платном хостинге, то это не имеет большого смысла так как
для сервера это не будет большой нагрузкой.

В целях малой оптимизации можно удалить из базы Российские, Казахстанские IP адреса.

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

четверг, 24 июля 2008 г.

Зарабатываем недвижимое.: PHP-NUKE HZ edition, скомпановал немножко CMS

Зарабатываем недвижимое.: PHP-NUKE HZ edition, скомпановал немножко CMS

Хостинг... и его другая сторона - партнерские программы

Всетаки определился с хостингом =), решил деньги не тратить, конечно на РБК получиться прикольно 5Гб и 10 баз, но нашел где-то5 партнерских программ у хостеров, если время размещения сайта не завтра, то можно спокойно наработать в этих программах, а потом уже соответственно размещаться. цены у всех примерно одинаковые и параметры серверов тоже, так что регистрируйтесь по ссылкам. Буду ждать зарплаты....

Программы которые нашлись: TAGhosting - долго работает и послухам выплачивает деньгу нормально
Партнерская программа ТаймВэб. 30-40% за оплаченные заказы. - www.timeweb.ru/partnership.htm - тоже вроде адекватно, т.к походу новые

ну соответственно монстр рынка ПЕТЕРХОСТ - у него подороже зато очень давно =)

PHP-NUKE HZ edition, скомпановал немножко CMS

В общем в систему добавлен модуль новости(стандартный остался) привязал к нему теги, и настроил динамический keywords, keywords работает так: если поля при заполнении оставить пустыми, то сгенирруются слова и автоматически добавяться в базу, можете также в ручную их прописать, также есть поле теги, в него записывать надо ключевые слова, по которым будут сортироваться новости, из-за великого Яндекса пришлось блок теги сделать NOINDEX т.к это он считает великим спамом, все равно для пользователей, к этому блоку можно настроить стили и он соответственно будет выглядить как настоящее облако тегов.

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

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



Делалось давно,решил выложить так сказать народу(на самом деле просто челвок попросил ему немного поковырять его сайт вот и доковырялся), некоторые запросы закешированы, не все, просто имеет смысл их оставить т.к они сильно не нагружают, потестили на нормальном сервере у которого хороший процессор.



Убрано коварно-нелепый счетчик посещений, которым не кто не когда не пользуется, пересмотрена безопасность проверки переменных, главная страница и конфиг скинуты в файл и к ним запрещен доступ с сервера, добавлен блок ярлыки (интересно стало как все-таки создаются теги вот и пришлось написать ярлыки, похоже на облако тегов, только меняется не размер, а показывается количество слов, по желанию можете найти скрипты которые по количеству слов вам подсчитают размер букв для облака).



В свое время тоже парился с кодировкой, по этому сделал сразу при соединении с сервером чтоб ощение шло через cp1251, так что проблемм с кодировкой и вопросиками не должно быть.



Убраны в админке постоянные запросы для добавлениея новых модулей, ну не добавляю я новых модулей каждый 5 секунд я просто мышкой по ссылкам хожу, а представляете если у вас было бы хотябы 60 модулей? ваш адский сервер при 50 посетителях просто лежалбы. Короче если добавили новый модуль достаточно просто нажать на обновление модулей в админке и они добавяться.

Не оптимизировано голосвание т.к отличный AJAX вариант еть на сервере русской поддержки, новости(родные) они тоже опитимизировали. Так что вроде проблемм с системой должно возникнуть.

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

В User_Info добавил любимую функцию определения ботов, место нахождения не стал прикручивать, т.к просто спать хотелось =)

P.S перед загрузкой и компановкой данного пакета посмотрел что сделали на рус-нюке, кажется странным зачем кешировать все блоки, а как же то, что меняется время от времени, конечно можно спокойно закешировать новости в БД и не тоскать их с голосованием каждый раз..... и надо бы поменять скрипт сжатия, и поставить довольно простой типа как в книжках пишут, почему? да потому-что если сайт зажимать, он весит горазда меньше, что позволяет его модемщикам качать (немного дольше чем просто страницу с текстом =) ), если сжатие не применимо, то оно работать не будет, соответственно смысл в кнопке включения, выключение сжатия пропадает.

P.S2 Дойдут руки доделаю web_links, у мну на сайте было: прямые ссылки и проверка обратной ссылки, что естественно поднимало индекс цитирования, но сейчас помоему прошла перетрубация и это уже не так сильно наращивает тИЦ. ссылка на файлик

Такой же файлик выложил на RUS-phpnuke - че-то долго не дабавляют, похоже че-то правят или не хотят добавлять, странно это....

среда, 23 июля 2008 г.

Блоги, психологический портрет или просто бред

Сегодня прийдя на работу поймал себя на мысли, что первым делом (после включения компа) зашел на статистику сайта, думал: ;№"я что - то народ не ходит, пошел смотреть как сайт в яндексе живет, оказывается нету его в яндексе посмотрел в гугле, там только 2500 страничек какого-то старого католога, который пришлось убить из-за траффика, но это наоборот было хорошо(в моем случае халява не прокатила т.к траф получался выливается в копеечку). Налил себе кофе, пошел курить на крыльцо, мимо проходили объемные женщины весом так в 120 Кг, они каждый день приходят когда я выхожу курить с кофе, и нашло.

Так продолжается уже 3 месяца, сверясь с часами стало понятно: тваю мать так они же в одно время приходят не зависимо от меня естественно и я как последний кретин, проверив статистику, почту, прочую хрень выхожу курить.... Такое ощущение что в замкнутом круге нахожусь не только я один, да и многие люди, в АДСКОЙ ПЕТЛЕ, котороя постоянно в себя затягивает и всех кто пытается из нее вырваться возвращает обратно.

Так походу и с блогами получается пришел такой обычный человек в блогосферу(сам того не понимая и думая, что он там один такой хороший и умный и сумеет привлечь людей, заработать). Развиваясь с каждым прочтением новых сообщений в блоге =) видит что он становиться мега монстр и даже пускай что-то зарабатывает, как правило подписавшись на чью-то ленту постит похожие статьи и пишет:[Я УМНЫЙ И МНОГО УМЕЮ И ЕЩЕ ВОТ МАЯ СВЕЖАЯ ИДЕЯ!]. Комментировать его идею как-то бессмысленно потому-что видно что он несет конкретную чушь и ахинею. Ну ничего в принципе тоже несу =).

В нете много народу... Бамжарики работают мозгом и способны читать текст в котором нету картинок, лишь только буквы, потому-что им нужна информация, а не удовлетворение зрительного нерва.

Офисные сотрудники им бы реально где - нибудь почитать эрорасказики, эрокартиночки, приватики, веслые картиночки .... и видео посмотреть. Люди которые зарабаттывают как сетивые маркетологи на куче пирамид из ссылок, рефералов, доров, сателитов в основном пользуются ГУГЛОМ, так как в Ящу значительно поднасрали =) и он шокировавшись выдает не понятно что....

Почитав Баш орг 2 раза понял что ничего нового он как-то не приносит только в мозг тупняк поступает. Классический дебилизатор.

Манимекеры прийдя в место где у него стоит комп с интернетом начинает смотреть статистику, кто на него сослался, может товарищ по разуму что-то дельное написал и интересное, есть такие люди их не так и много. Зато много Кать Гордонов, которые пишут лайфжурналы и выплескиавют на читателя свою, по большей части, гнилую натуру. Катю знают катю ищут в интернете =) , а как же быть с теми кого не ищут, они пишут и пишут, про то какже печальна жизнь....

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

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

Какой-то шибко умный парень либо сильно ворующий слова у laslo Либо laslo
Жилин Сергей Павлович. День рождения 29-го июля. Родился и живет в Ижевске
Ну а теперь пойдут полу профи =) почему полу, потому-что неизвестно сколько зарабатывают хотя пишут что много (Это мое личное так что не обижаться!=))))
Уникальний человеГ
Безколесный лютый адский ЧЕЛ
хмм.... да похер ковырну ссылки с его поста что прочитал:

Chipp - социальная сеть для блогеров и манимейкеров

Хочу в ночлежку! Что-то я забываю дать ссылку. Дружно кликаем на нее, а то поеду в Минск скоро, а ночевать то, блин, негде будет! =)

продвижения сайтов с помощью XAP (TNX) - доступнее не бывает!

Ну а если кто еще не знает про этот блог, то напоминаю, что есть такой блог Ольги Ивановой - женский взгляд на интернет маркетинг

Ужин на троих: Гугл, Рамблер и Бегун

Это может быть только в России! Зацепило…

Лучший блог хостинг. Только индивидуальный подход. Домен в подарок.
Кистевой тренажер

Типа конец его ссылок

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

вторник, 22 июля 2008 г.

cms - движок как выбриратьих?

Сижу и думаю, как надоело просто тупо Брать и устанавливать cms.... за это получаешь копейки, а у людей за один раз ворют по 1,5 миллиона рублей, вырывают пакет пока человек из банка до машины идет и забирают, мда странно это все и не чего не поделать... печаль короче... зарабатывает же кто-то 8-) а мне гребаный мир продает неработающие холодильники КАЗЛЫ чтобы у вас в регионах все прогарело..... чето крышу опять сорвало =)....

воскресенье, 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
великий человек много написал, там кстате есть оптимизация модуля новостей....
Самописные содули еще есть тут и вот тут так что ищите.....

забыл совсем, что не выложил собраный архив с данными модификациями...

Тык Тык UpToLike