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