Немного обо всем интересном
На главную Обратная связь Поиск
Главная
Форум
 
 
 
Если вы только начали изучать строительство сайтов, и у вас возникают различные вопросы по HTML, CSS или PHP – Вы можете их задавать на нашем форуме.
С радостью постараемся вам помочь.
  Статьи Файлы Видео Кулинарные рецепты Города и Страны Разное  
Отдых и развлечения Юмор Видео, ТВ и музыка Непознанное Литература Спорт Игры Хобби
Окружающий мир Люди Страны и города География Флора и фауна Космос
Технологии Hardware Операционные системы Софт Интернет Мобильные устройства Сети и сетевая безопасность Разное
Дизайн и программирование Веб-строительство Дизайн и графика

Все статьи Список статей Добавить статью
 
Вниз
Уменьшение нагрузки на сервер в PHP-Nuke, в 10 раз!!!


 
Ответить в эту тему    Открыть новую тему    Опции темы
Alexander-V-Sh

Мимо проходил
Иконка группы
Администратор
490
Сообщений
сообщение 29.4.2008 15:34
Сообщение #1

Никому не секрет, что CMS PHP-Nuke создает большую нагрузку на сервер.
Все статьи, как правило, поставлены на оптимизацию работы с базой данных (MySQL)
Но есть еще фактор нагрузки сервера скриптами.
Не так давно столкнулся с такой проблемой, из-за которой отключили сайт…

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

Отчеты приходили, что статистическая нагрузка всегда в пределах от 40 до 90 (максимальная 50) За превышение и был отключен сайт. Суппорт ответил, что висит порядка 50-ти процессов Apache, это много, из-за этого и возникает нагрузка.

Стал разбираться. Первым делом отключил GZIP и буферизацию. Нагрузка снизилась в 10 раз, вместо 40-90, стало 4-9. Дальше даже не стал, разбираться, этого больше чем достаточно.

Что нужно сделать:
Открываем mainfile.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');
              }
        }
      }
}

Открываем footer.php
Находим и удаляем
Код
    ob_end_flush();


У данного способа есть только 1 минус – на сайте отключено сжатие GZIP, что скажется на трафике посетителей.

P.S. В вопросах буферизацации я очень не силен, возможно можно не удалить, а изменить данные строки, чтобы и Гзип с буферизацией оставить и нагрузку уменьшить. Если кто подскажет - буду очень благодарен.
 
Ответить | Цитировать+
Timur
Аватар не загружен
сообщение 11.6.2008 22:45
Сообщение #2

Спасибо, может пригодиться)
 
Ответить | Цитировать+
Alexander-V-Sh

Мимо проходил
Иконка группы
Администратор
490
Сообщений
сообщение 14.6.2008 12:27
Сообщение #3

У меня как то не очень пригодилось :(

Или с кодом что то не так, или глючит статистика хостинга.

Как только сделал изменения - нагрузка их упала как и в статье написал. А спустя неделю, опять увеличилась... Меньше не в 10 раз, а примерно в 1.5-2 раза сейчас.
 
Ответить | Цитировать+
h4ck3r

Иконка группы
Владеющий фактами
199
Сообщений
сообщение 03.3.2009 08:56
Сообщение #4

Цитата(Alexander-V-Sh @ 29.4.2008 15:34) *
Никому не секрет, что CMS PHP-Nuke создает большую нагрузку на сервер.
Все статьи, как правило, поставлены на оптимизацию работы с базой данных (MySQL)
Но есть еще фактор нагрузки сервера скриптами.
Не так давно столкнулся с такой проблемой, из-за которой отключили сайт…

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

Отчеты приходили, что статистическая нагрузка всегда в пределах от 40 до 90 (максимальная 50) За превышение и был отключен сайт. Суппорт ответил, что висит порядка 50-ти процессов Apache, это много, из-за этого и возникает нагрузка.

Стал разбираться. Первым делом отключил GZIP и буферизацию. Нагрузка снизилась в 10 раз, вместо 40-90, стало 4-9. Дальше даже не стал, разбираться, этого больше чем достаточно.

P.S. В вопросах буферизацации я очень не силен, возможно можно не удалить, а изменить данные строки, чтобы и Гзип с буферизацией оставить и нагрузку уменьшить. Если кто подскажет - буду очень благодарен.


Интересна такая вот штука.... Gzip же есть на многих движках. И обычно в настройках можно устанавливать степеть сжатия, так вот влияет ли степень сжатия на нагрузку? И вообще можно что-нибудь услышать, чем можно серв сильно нагрузить?
 
Ответить | Цитировать+
W_Wolf

Волк
Иконка группы
<<Тёмная гильдия>>
205
Сообщений
сообщение 04.3.2009 19:15
Сообщение #5

h4ck3r, да, степень сжатия влияет на нагрузку. Чем больше - тем больше нагрузка.
Помимо гзипа, сервер можно нагрузить скриптами с большим количеством циклов, использованием с скриптах специфических библиотек, например графических, а так же большим количеством обращений к БД.
 
Ответить | Цитировать+
h4ck3r

Иконка группы
Владеющий фактами
199
Сообщений
сообщение 07.3.2009 12:29
Сообщение #6

А можешь поподробнее расписать что и как грузит сервак, чтобы предостеречь себя и подстраховаться? Если точно неизвестно, то хотя бы в какой степени идет нагрузка.
 
Ответить | Цитировать+
Alexander-V-Sh

Мимо проходил
Иконка группы
Администратор
490
Сообщений
сообщение 07.3.2009 13:28
Сообщение #7

Можно поставить счетчик и самому все наблюдать.
Для этого в самое начало движка пишим:

Код
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$start_time = $mtime;


А в самый конец:
Код
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$end_time = $mtime;
$totaltime = ($end_time - $start_time);
$totaltime = "Генерация страницы: ".substr($totaltime,0,5)."";
echo "$totaltime";


Можно испытать это просто на пустом файле, сделав скрипт:
Код
<?php
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$start_time = $mtime;

for ($i=1; $i<=3000; $i++) {
echo "$i ";
}

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$end_time = $mtime;
$totaltime = ($end_time - $start_time);
$totaltime = "Генерация страницы: ".substr($totaltime,0,5)." сек.";
echo "<br><br>$totaltime";
?>


Увеличивая значение 3000, можно посмотреть, насколько долше грузится страница, а соотв. и сервер.
 
Ответить | Цитировать+
Alexander-V-Sh

Мимо проходил
Иконка группы
Администратор
490
Сообщений
сообщение 07.3.2009 13:46
Сообщение #8

Грузят еще регулярки, например, в нюке функции-фильтры:
Код
/*********************************************************/
/* text filter                                           */
/*********************************************************/

function check_words($Message) {
    global $CensorMode, $CensorReplace, $EditedMessage;
    include("config.php");
    $EditedMessage = $Message;
    if ($CensorMode != 0) {
        if (is_array($CensorList)) {
            $Replace = $CensorReplace;
            if ($CensorMode == 1) {
                for ($i = 0; $i < count($CensorList); $i++) {
                    $EditedMessage = eregi_replace("$CensorList[$i]([^a-zA-Z0-9])","$Replace\\1",$EditedMessage);
                }
            } elseif ($CensorMode == 2) {
                for ($i = 0; $i < count($CensorList); $i++) {
                    $EditedMessage = eregi_replace("(^|[^[:alnum:]])$CensorList[$i]","\\1$Replace",$EditedMessage);
                }
            } elseif ($CensorMode == 3) {
                for ($i = 0; $i < count($CensorList); $i++) {
                    $EditedMessage = eregi_replace("$CensorList[$i]","$Replace",$EditedMessage);
                }
            }
        }
    }
    return ($EditedMessage);
}

function delQuotes($string){
    /* no recursive function to add quote to an HTML tag if needed */
    /* and delete duplicate spaces between attribs. */
    $tmp="";    # string buffer
    $result=""; # result string
    $i=0;
    $attrib=-1; # Are us in an HTML attrib ?   -1: no attrib   0: name of the attrib   1: value of the atrib
    $quote=0;   # Is a string quote delimited opened ? 0=no, 1=yes
    $len = strlen($string);
    while ($i<$len) {
        switch($string[$i]) { # What car is it in the buffer ?
        case "\"": #"       # a quote.
        if ($quote==0) {
            $quote=1;
        } else {
            $quote=0;
            if (($attrib>0) && ($tmp != "")) { $result .= "=\"$tmp\""; }
            $tmp="";
            $attrib=-1;
        }
        break;
        case "=":           # an equal - attrib delimiter
        if ($quote==0) {  # Is it found in a string ?
        $attrib=1;
        if ($tmp!="") $result.=" $tmp";
        $tmp="";
        } else $tmp .= '=';
        break;
        case " ":           # a blank ?
        if ($attrib>0) {  # add it to the string, if one opened.
        $tmp .= $string[$i];
        }
        break;
        default:            # Other
        if ($attrib<0)    # If we weren't in an attrib, set attrib to 0
        $attrib=0;
        $tmp .= $string[$i];
        break;
        }
        $i++;
    }
    if (($quote!=0) && ($tmp != "")) {
        if ($attrib==1) $result .= "=";
        /* If it is the value of an atrib, add the '=' */
        $result .= "\"$tmp\"";  /* Add quote if needed (the reason of the function;-) */
    }
    return $result;
}

function check_html ($str, $strip="") {
    /* The core of this code has been lifted from phpslash */
    /* which is licenced under the GPL. */
    include("config.php");
    if ($strip == "nohtml")
    $AllowableHTML=array('');
    $str = stripslashes($str);
    $str = eregi_replace("<[[:space:]]*([^>]*)[[:space:]]*>",'<\\1>', $str);
    // Delete all spaces from html tags .
    $str = eregi_replace("<a[^>]*href[[:space:]]*=[[:space:]]*\"?[[:space:]]*([^\" >]*)[[:space:]]*\"?[^>]*>",'<a href="\\1">', $str);
    // Delete all attribs from Anchor, except an href, double quoted.
    $str = eregi_replace("<[[:space:]]* img[[:space:]]*([^>]*)[[:space:]]*>", '', $str);
    // Delete all img tags
    $str = eregi_replace("<a[^>]*href[[:space:]]*=[[:space:]]*\"?javascript[[:punct:]]*\"?[^>]*>", '', $str);
    // Delete javascript code from a href tags -- Zhen-Xjell @ http://nukecops.com
    $tmp = "";
    while (ereg("<(/?[[:alpha:]]*)[[:space:]]*([^>]*)>",$str,$reg)) {
        $i = strpos($str,$reg[0]);
        $l = strlen($reg[0]);
        if ($reg[1][0] == "/") $tag = strtolower(substr($reg[1],1));
        else $tag = strtolower($reg[1]);
        if ($a = $AllowableHTML[$tag])
        if ($reg[1][0] == "/") $tag = "</$tag>";
        elseif (($a == 1) || ($reg[2] == "")) $tag = "<$tag>";
        else {
            # Place here the double quote fix function.
            $attrb_list=delQuotes($reg[2]);
            // A VER
            //$attrb_list = ereg_replace("&","&",$attrb_list);
            $tag = "<$tag" . $attrb_list . ">";
        } # Attribs in tag allowed
        else $tag = "";
        $tmp .= substr($str,0,$i) . $tag;
        $str = substr($str,$i+$l);
    }
    $str = $tmp . $str;
    return $str;
    exit;
    /* Squash PHP tags unconditionally */
    $str = ereg_replace("<\?","",$str);
    return $str;
}

function filter_text($Message, $strip="") {
    global $EditedMessage;
    check_words($Message);
    $EditedMessage=check_html($EditedMessage, $strip);
    return ($EditedMessage);
}

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);
        if (!get_magic_quotes_gpc()) {
        $what = addslashes($what);
}
    } else {
        $what = stripslashes(FixQuotes($what,$strip));
        $what = check_words($what);
        $what = check_html($what, $strip);
    }
    return($what);
}

Тут конструкция вида:

Код
$text = "Привет!";
$text = filter($text);
echo "$text";


В функии filter используется функция check_html (а она юзает функцию delQuotes) и check_words. Эти функции запрашивают массивы с разрешенными тегами и запрещеннами словами (а это может быть тысячи слов к примеру).

И вот наше простое слово "Привет!", которое мы хотим вывести, проходит через такое обилие обработки.
А если у нас вывод 100 слов? И каждое пройдет такой ад проверок и фильтров, что нагрузит сервер.

Поэтому все устройство в нюке фильтров - очень неразумное.
Во-первых, фильтры применяются одинаковые и к админу и к юзерю. Что ущемляет права первому и дает много второму.
Во-вторых, зачем проверять стоп слова на выводе, их надо проверять на вводе и только от пользователей.
В третьих, параметр "nohtml" в функции filter грузит сильно, но зачем выризать теги регулярками, когда в ПХП есть функция strip_tags

Другими словами все это нагромождения кода, можно упросить в несколько раз, повысить безопасность и уменьшить нагрузку.
 
Ответить | Цитировать+
Dimkaa

Иконка группы
Увлеченный
39
Сообщений
сообщение 11.8.2019 14:09
Сообщение #9

Спасибо, может пригодиться)
 
Ответить | Цитировать+
ТигрулЯ

Иконка группы
Увлеченный
11
Сообщений
сообщение 13.8.2019 21:17
Сообщение #10

Gjlktpyfz byaf vt;le ghjxbv
 
Ответить | Цитировать+
   Ответить в эту тему   Открыть новую тему
Информация
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Быстрый переход:
 
Вверх
2006-2008 Интересное.инфо. Русская версия IP.Board © 2019  IPS, Inc.
Лицензия зарегистрирована на: Interesnoe.info
  Rambler's Top100