Показать сообщение отдельно
Soniks вне форума      Старый оптимизация Php-nuke #1  
Soniks
Администратор
Регистрация: 16.01.2005
Сообщения: 4,814


Пожаловаться на это сообщениеОтветить с цитированием

Посмотреть профиль Отправить персональное сообщение для Soniks Посетить домашнюю страницу Soniks Найти все сообщения от Soniks Добавить Soniks в список друзей  
10.02.2006, 16:24

Ни для кого не секрет, что PHP-Nuke является очень ресурсно-потребной системой, и при посещаемости сайта, основанного на php-nuke, свыше 800 уникальных заходов в день, ваш сайт будет перегружать и Базу Данных, и собственно, сам сервер. Следствие чего хостнг-провайдер попросит вас, либо сменить cms, либо перейти на выделенный сервер. И они будут правы, т.к. в среднем (при наборе стандартных модулей и блоков) каждая открываемая страница пользователем производит порядка 80-120 запросов к БД (порой бывает даже 300 запросов), что из ряда вон много. Все это из-за того что php-nuke написана очень просто и использует наиболее легкие методы исполнения работы скрипта, что результат увеличение запросов к БД.



В данной теме мы постараемся максимально снизить нагрузку с БД и php, но не изменить структуру php-nuke. Так же будет по ходу выполнения исправлять допущенные ошибки автором в скриптах.

За основу взята php-nuke версии 7.9 (без каких либо патчей).

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

Чтобы узнать, сколько в данный момент у вас выполняет сайт запросов к БД, проследуйте в эту тему форума и произведите изменения указанные там.

Тема для обсуждения

Начнем мы с оптимизации «ядра» системы. А именно с файла mainfile.php

1. В целях повышения безопасности ограничиваем поступление переменных $admin и $user

Находим:
PHP код:
 if(isset($admin))
{
$admin base64_decode($admin);
$admin addslashes($admin);
$admin base64_encode($admin);
}
if(isset(
$user))
{
$user base64_decode($user);
$user addslashes($user);
$user base64_encode($user);


Заменяем на:
PHP код:
 // Copyright Soniks http://mynuke.ru
if(isset($_COOKIE['admin']))
{
$admin base64_decode($_COOKIE['admin']);
$admin addslashes($admin);
$admin base64_encode($admin);
}else{
unset(
$admin);
}
if(isset(
$_COOKIE['user']))
{
$user base64_decode($_COOKIE['user']);
$user addslashes($user);
$user base64_encode($user);
}else{
unset(
$user);


2. Изменим вызов конфиг файла и подключение к бд, находим:
PHP код:
 if (defined('FORUM_ADMIN')) {
require_once(
"../../../config.php");
require_once(
"../../../db/db.php");
} elseif (
defined('INSIDE_MOD')) {
require_once(
"../../config.php");
require_once(
"../../db/db.php");
} else {
require_once(
"config.php");
require_once(
"db/db.php");
/* FOLLOWING TWO LINES ARE DEPRECATED BUT ARE HERE FOR OLD MODULES COMPATIBILITY */
/* PLEASE START USING THE NEW SQL ABSTRACTION LAYER. SEE MODULES DOC FOR DETAILS */
require_once("includes/sql_layer.php");
$dbi sql_connect($dbhost$dbuname$dbpass$dbname);


и заменим на:
PHP код:
 if (defined('FORUM_ADMIN')) {
define('NUKE_PATH''../../../');
require_once(
NUKE_PATH."config.php");
require_once(
NUKE_PATH."db/db.php");
} elseif (
defined('INSIDE_MOD')) {
define('NUKE_PATH''../../');
require_once(
NUKE_PATH."config.php");
require_once(
NUKE_PATH."db/db.php");
} else {
define('NUKE_PATH''./');
require_once(
NUKE_PATH."config.php");
require_once(
NUKE_PATH."db/db.php");
 
/* FOLLOWING TWO LINES ARE DEPRECATED BUT ARE HERE FOR OLD MODULES COMPATIBILITY */
/* PLEASE START USING THE NEW SQL ABSTRACTION LAYER. SEE MODULES DOC FOR DETAILS */
require_once("includes/sql_layer.php");
$dbi sql_connect($dbhost$dbuname$dbpass$dbname);


Обратите здесь внимание на строки:
PHP код:
 /* FOLLOWING TWO LINES ARE DEPRECATED BUT ARE HERE FOR OLD MODULES COMPATIBILITY */
/* PLEASE START USING THE NEW SQL ABSTRACTION LAYER. SEE MODULES DOC FOR DETAILS */
require_once("includes/sql_layer.php");
$dbi sql_connect($dbhost$dbuname$dbpass$dbname); 

если вы не используете модули или блоки от старых версий phpnuke, то удалите эти строчки, это позволит снизить нагрузку к БД.
3. Если у вас в mainfile.php нет такой записи, то добавляем ее в начало файла на следующей строчке после <?php :
PHP код:
 define('NUKE_FILE'true); 

4. Теперь уберем один запрос из системы посредством кэширования статичной информации в файл. Для этого находим:
PHP код:
 $result $db->sql_query("SELECT * FROM ".$prefix."_config");
$row $db->sql_fetchrow($result);
$sitename filter($row['sitename'], nohtml);
$nukeurl filter($row['nukeurl'], nohtml);
$site_logo filter($row['site_logo'], nohtml);
$slogan filter($row['slogan'], nohtml);
$startdate filter($row['startdate'], nohtml);
$adminmail filter($row['adminmail'], nohtml);
$anonpost intval($row['anonpost']);
$Default_Theme filter($row['Default_Theme'], nohtml);
$foot1 filter($row['foot1']);
$foot2 filter($row['foot2']);
$foot3 filteR($row['foot3']);
$commentlimit intval($row['commentlimit']);
$anonymous filter($row['anonymous'], nohtml);
$minpass intval($row['minpass']);
$pollcomm intval($row['pollcomm']);
$articlecomm intval($row['articlecomm']);
$broadcast_msg intval($row['broadcast_msg']);
$my_headlines intval($row['my_headlines']);
$top intval($row['top']);
$storyhome intval($row['storyhome']);
$user_news intval($row['user_news']);
$oldnum intval($row['oldnum']);
$ultramode intval($row['ultramode']);
$banners intval($row['banners']);
$backend_title filter($row['backend_title'], nohtml);
$backend_language filter($row['backend_language'], nohtml);
$language filter($row['language'], nohtml);
$locale filter($row['locale'], nohtml);
$multilingual intval($row['multilingual']);
$useflags intval($row['useflags']);
$notify intval($row['notify']);
$notify_email filter($row['notify_email'], nohtml);
$notify_subject filter($row['notify_subject'], nohtml);
$notify_message filter($row['notify_message'], nohtml);
$notify_from filter($row['notify_from'], nohtml);
$moderate intval($row['moderate']);
$admingraphic intval($row['admingraphic']);
$httpref intval($row['httpref']);
$httprefmax intval($row['httprefmax']);
$CensorMode intval($row['CensorMode']);
$CensorReplace filter($row['CensorReplace'], nohtml);
$copyright filter($row['copyright']);
$Version_Num filter($row['Version_Num'], nohtml); 

и заменяем на:
PHP код:
 // Copyright Soniks http://mynuke.ru
// GET CONFIG VARIABLE
$userinfo = array();
if(
file_exists(NUKE_PATH."cache/config")){
include_once(
NUKE_PATH."cache/config");
}else{ 
$result $db->sql_query("SELECT * FROM ".$prefix."_config LIMIT 1");
$sett ="<?php\n\n";
$sett .="if(!defined('NUKE_FILE'))\n{\n die();\n}\n";
foreach(
mysql_fetch_assoc($result) as $key => $value){
$
$key $value;
$sett .="$".$key." = \"".str_replace('"','\"',$value)."\";\n";

$sett .="\n?>";
$fp fopen (NUKE_PATH."cache/config""wb");
fwrite($fp$sett);
fclose($fp);
if(!
file_exists(NUKE_PATH."cache/.htaccess")){
$sett2 ="deny from all";
$fp2 fopen (NUKE_PATH."cache/.htaccess""wb");
fwrite($fp2$sett2);
fclose($fp2);
}
}
 
// GET MODULES
$modules_info = array();
$result $db->sql_query("SELECT title, custom_title, active, view, inmenu, mod_group FROM ".$prefix."_modules");
while (list(
$title_cnf$custom_title_cnf$active_cnf$view_cnf$inmenu_cnf$mod_group_cnf) = $db->sql_fetchrow($result)){
$modules_info[$title_cnf] = array('custom_title' =>$custom_title_cnf'active'=>$active_cnf'view'=>$view_cnf'inmenu'=>$inmenu_cnf'mod_group'=>$mod_group_cnf);


После этого создаем в главной директории папку с именем cache и назначаем права на запись (775 или 777).
 
"Если бы вам удалось надавать под зад человеку, виноватому в большинстве ваших неприятностей - вы бы неделю не смогли сидеть".