Основная задача решаемая в данной статье позволить пользователю и разработчику анализировать нагрузку на сайт на протяжении определенного интервала времени по средством графика и отчетов.
[spoiler]
При анализе производительности сайта часто можно наблюдать разную производительность всей системы в разные промежутки времени
Примером того может стать случай, когда на разделяемом хостинге на "соседнем" аккаунте создается значительная нагрузка, что приводит к падению производительности в целом на всем сервер.
Визуально это может выражаться медленной генерации страниц сайта при этом смоделировать данную ситуацию при диагностики в тех же условиях будет тяжело т.к. нагрузка на соседнем аккаунте носит периодичный характер.
Помощью в диагностики проблемы может стать не прерывный сбор статистики времени генерации страниц сайта.
1 Т.к. время генерации страницы будем хранить в БД создадим таблицу bx_perf_graph
CREATE TABLE `bx_perf_graph` ( `ID` int(18) NOT NULL AUTO_INCREMENT, `PAGE_TIME` varchar(20) DEFAULT NULL, `DATE_HIT` datetime DEFAULT NULL, `USER_ID` int(18) DEFAULT NULL, `URL` text, `URL_FROM` text, `IP` varchar(15) DEFAULT NULL, `METHOD` varchar(10) DEFAULT NULL, `COOKIES` text, `USER_AGENT` text, `SITE_ID` char(2) DEFAULT NULL, PRIMARY KEY (`ID`), KEY `IX_PAGE_TIME` (`PAGE_TIME`), KEY `IX_DATE_HIT` (`DATE_HIT`) ) ENGINE=InnoDB |
2 Далее в /bitrix/php_interface/init.php разместим константу
define('PAGE_START_TIME',microtime(1)); |
3 В этом же файле разместим обработчик, который будет фиксировать время генерации только для публичной части сайта
AddEventHandler('main','OnAfterEpilog','WriteTime'); function WriteTime() { global $DB; function bx__GetFullRequestUri(){ $url = $_SERVER["REQUEST_URI"]; $host = $_SERVER["HTTP_HOST"]; $port = $_SERVER["SERVER_PORT"]; $protocol = CMain::IsHTTPS() ? "https" : "http"; $res = ""; $host_exists = (strpos($url, "http://")===false && strpos($url, "https://")===false) ? false : true; if (!$host_exists) { if (strlen($protocol)>0) $res = $protocol."://"; if (strlen($host)>0) $res .= $host; if (intval($port)>0 && intval($port)!=80 && intval($port)!=443 && strpos($host, ":")===false) $res .= ":".$port; } if (strlen($url)>0) $res .= $url; if(strpos($res, "/bitrix/admin/")!==false) { $res = str_replace("&mode=list", "", $res); $res = str_replace("&mode=frame", "", $res); } return $res; } function bx_GetCookieString(){ $arrCookie = $_COOKIE; if (is_array($arrCookie) && count($arrCookie)>0) { foreach($arrCookie as $key => $value) { $res .= "[".$key."] = ".$value."\n"; } } return $res; } $SITE_ID = ""; if (!defined("ADMIN_SECTION") || ADMIN_SECTION===false) { if (defined("SITE_ID")) { $sql_site = "'".$DB->ForSql(SITE_ID,2)."'"; $SITE_ID = SITE_ID; } else $sql_site = "null"; $arFields = Array( "PAGE_TIME" => microtime(1) - PAGE_START_TIME, "DATE_HIT" => $DB->GetNowFunction(), "USER_ID" => intval($_SESSION["SESS_LAST_USER_ID"]), "URL" => "'".$DB->ForSql(bx__GetFullRequestUri(),2000)."'", "URL_FROM" => "'".$DB->ForSql($_SERVER["HTTP_REFERER"],2000)."'", "IP" => "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'", "METHOD" => "'".$DB->ForSql($_SERVER["REQUEST_METHOD"],10)."'", "COOKIES" => "'".$DB->ForSql(bx_GetCookieString(),2000)."'", "USER_AGENT" => "'".$DB->ForSql($_SERVER["HTTP_USER_AGENT"],500)."'", "SITE_ID" => $sql_site, ); $HIT_ID = $DB->Insert("bx_perf_graph", $arFields, "File: ".__FILE__."<br>Line: ".__LINE__); } } |
4 Для анализа собранных данных в административной части разместим файл /bitrix/admin/graph.php
В данном примере предложен минимальный набор инструментов
а) очистка всех собранных данных
б) поле ввода даты для построения графика и формирование отчета
в) поле для указания допустимого времени генерации страницы (по умолчанию – 3 секунды)
г) представление графика по часам и по минутам
При построение графика по умолчанию берется представление – по часам, т.е. по оси абсцисс откладываются часы суток в которых была зафиксирована нагрузка на сайт, по оси ординат максимальные значение нагрузки на сайт в рамках определенного часа. В режиме представления по минутам по оси ординат откладываются максимальные значения нагрузки поминутно.
Согласно представлению под графиком строиться отчет – с максимальными нагрузками на сайт.
В нижней части отчета предложена ссылка “Подробнее” при переходе по которой доступен детальный отчет по хитам за определенный день указанный в фильтре.
В отчете предложен набор полей который понадобиться разработчику для проведения полноценной диагностики.
а) Время генерации страницы
б) Дата генерации страницы
в) ID пользователя
г) URL страницы
д) URL страницы от куда осуществлялся переход
е) IP адрес пользователя
ж) Тип запроса
з) Кука пользователя
и) User agent пользователя
к) ID сайта
Построение самого графика осуществляется подключаемыми классами pChart.
Данный скрипт решает общую задачу визуализации нагрузки на сайт и сбора данных по нагрузке.
Реализацию задач:
а) Сортировка отчетов
б) Фильтрация отчетов
в) Реализации логики по очистке собранных данных (возможность выполнения на агенте)
г) Реализации логики по анализу собранных данных за день и в случае превышение установленного лимита рассылка уведомления администратору (возможность выполнения на агенте)
оставил разработчикам сайтов в случае если необходима реализация данных частных случаев.
Анализируя полученные отчеты можно с уверенностью говорить о том какие страницы сайта создают большую нагрузку на сервер и с каким в целом временем генерируется страницы на протяжении любого промежутка времени.
Используя данное решение совместно с штатными средствами Вы получаете комплексные инструмент для анализа производительности сайта.
Архив необходимо распаковать в папку /graph