Облагораживаем статистику производительности вер. 2.0

Продолжаем разговор на тему любви и секса.
На днях освободился от заказов и решил довести до ума сию наработку.

Изменения:
  • Теперь статистику можно свернуть\развернуть (состояние запоминается)
  • Добавлено отобажение потребляемой памяти (by Vladimir3)
  • И по мелочам — замена коротких тегов php на обычные, немного измененная верстка и более темный цвет текста

Скрин:



Итак, если кому-то понравилось, то вот как это можно сделать:

1) Открываем index.php и заменяем все его содержимое этим:
<?php
/*-------------------------------------------------------
*
*   LiveStreet Engine Social Networking
*   Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
*   Official site: www.livestreet.ru
*   Contact e-mail: rus.engine@gmail.com
*
*   GNU General Public License, version 2:
*   http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
define('LS_VERSION','0.3.1');
define('SYS_HACKER_CONSOLE',false);
header('Content-Type: text/html; charset=utf-8');

$t1=microtime(true);

set_include_path(get_include_path().PATH_SEPARATOR.dirname(__FILE__));
chdir(dirname(__FILE__));
require_once("./config/config.php");
require_once("./classes/engine/Router.class.php");

$oRouter=Router::getInstance();
$oRouter->Exec();
$aStats=$oRouter->getStats();
$t2=microtime(true);
?>

<?php 
$oUser=$oRouter->User_GetUserCurrent();
if (Router::GetIsShowStats() and $oUser and $oUser->isAdministrator()) {
?>
<style type="text/css">
#stat_bg { padding:0 0 20px 40px; color:#999; font:12px/18px "Trebuchet MS", Arial, Helvetica, sans-serif; background:transparent; }
#stat_bg #slider_toggle { font-size:14px; color:#999; text-decoration:none; }
#stat_bg #slider_status { font-size:12px; }
#stat_bg #slider_content { height:90px; padding-top:15px; }
#stat_bg #slider_content .performance { height:90px; float:left; padding:0 15px; border-right:1px solid #eee; }
#stat_bg #slider_content .performance ul { list-style:none; }
</style>
<script type="text/javascript">
//<![CDATA[
	window.addEvent('domready', function() {
		var start = Cookie.read('slider_start') || '0px';
		var status = {'true': '↑','false': '↓'};
		var statSlider = new Fx.Slide('slider_content');

		if (start == '-105px') {
			statSlider.open = false;
		}
		$('slider_content').setStyle('margin-top', start);
		$('slider_status').set('html', status[statSlider.open]);
		$('slider_toggle').addEvent('click', function(e) {
			e.stop();
			statSlider.toggle();
		});
		statSlider.addEvent('complete', function() {
			$('slider_status').set('html', status[statSlider.open]);
			new Fx.Scroll(window).toBottom();
			start = $('slider_content').getStyle('margin-top');
			Cookie.write('slider_start', start, {
				domain: '<?php echo(SYS_COOKIE_HOST);?>',
				path: '<?php echo(SYS_COOKIE_PATH);?>',
				duration: 30
			});
		});
	});
//]]>
</script>
<div id="stat_bg">
	<a id="slider_toggle" href="#">Статистика производительности <span id="slider_status"></span></a>
	<div id="slider_content">
		<div class="performance" style="padding-left:0;">
			<ul>
				<li><b>Работа с БД:</b></li>
				<li>Запросов: <?php echo($aStats['sql']['count']); ?></li>
				<li>Время: <?php echo($aStats['sql']['time']); ?> с.</li>
			</ul>
		</div>

		<div class="performance">
			<ul>
				<li><b>Работа с кэшем:</b></li>
				<li>Запросов: <?php echo($aStats['cache']['count']); ?> из них</li>
				<li> — записей: <?php echo($aStats['cache']['count_set']); ?></li>
				<li> — прочтений: <?php echo($aStats['cache']['count_get']); ?></li>
				<li>Время: <?php echo(round($aStats['cache']['time'],5)); ?> с.</li>
			</ul>
		</div>

		<div class="performance">
			<ul>
				<li><b>Потребление ОЗУ:</b></li>
				<li>Среднее: <?php echo(round(memory_get_usage()/1024/1024, 2)) ?> Мб</li>
				<li>Максимальное: <?php echo(round(memory_get_peak_usage()/1024/1024, 2)) ?> Мб</li>
			</ul>
		</div>

		<div class="performance" style="border:0;">
			<ul>
				<li><b>PHP:</b></li>
				<li>Время загрузки модулей: <?php echo($aStats['engine']['time_load_module']); ?> с.</li>
				<li>Общее время загрузки страницы: <?php echo(round($t2-$t1,3)); ?> с.</li>
			</ul>
		</div>
	</div>
</div>
<?php } ?>

2) Сохраняем измененный файл в кодировке UTF-8 без BOM (без сигнатур).

Если вы ничего не меняли в стандартной комплектации движка, то можете просто скопировать с заменой исправленный файл index.php, который после модерации будет доступен здесь.

UPD: Товарищи, быть может у кого-то из вас есть лишние инвайты на хабр и лепру? Буду очень благодарен, если поделитесь. Заранее спасибо)

27 комментариев

avatar
Знаешь чтобы сказал хабракат?)
avatar
Спасибо, исправил) Все время про него забываю, каюсь)
avatar
круто!
avatar
Вот теперь спасибо, теперь оно выглядит закончено и красиво. сижу кликаю выдвинуть задвинуть =) надо теперь для полноты картину скин сделать чтоб вобще все можно было двигать с места на место и открывать закрывать. Юзер минимум на пол часа будет у вас зависать =)

А вобше и правда спасибо, получилось то что надо.
avatar
Меня всегда завораживали подобные «выдвигашки», тоже поначалу игрался =)

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

Юзер минимум на пол часа будет у вас зависать =)
По дефолту юзерам статистика не показывается =) Кстати, если кто-то не знает как показывать эту статистику всем, а не только админам, то нужно всего-лишь заменить в index.php это:
<?php
$oUser=$oRouter->User_GetUserCurrent();
if (Router::GetIsShowStats() and $oUser and $oUser->isAdministrator()) {
?>
на это:
<?php
if (Router::GetIsShowStats()) {
?>
avatar
для полноты картину скин сделать чтоб вобще все можно было двигать с места

я не про статистику же =) чем больше юзеру дать игрушек тем дольше он будет на сайте

а как дать юзеру видеть статистику или ещё что-то это вполне понятно.

только думаю дурная практика давать юзеру видеть статистику. ибо найдутся те кто будет пробывать разные варианты как бы получить нагрузки побольше (новая игра получи статистику хуже =) )
avatar
Из полезных игрушек можно попробовать дать юзерам сворачивать\разворачивать блоки :)

Статистику на обычном проекте я бы тоже не стал давать пользователям, ибо им это и не надо. А вот на livestreet.ru я бы на месте Максима открыл статистику всем, чтобы было наглядно видно какая производительность у движка. На конкурирующих проектах так и сделано =)
avatar
Меня всегда завораживали на сайтах такие «игрушки» :) А с блоками это вы хорошо придумали.
avatar
с блоками это ещё до него придумали =)

кстати на счет блоков… я бы не сворачивание делал (ибо блоки с адсенсом давать сворачивать грешно =) ) а дал юзеру возможность передвигать блоки местами. благо библиотеки для этого есть в «интернетах» готовые уже.
блоки у нас ширины одинаковой, дизайн не поплывет, хранить в куках все это дело. думаю можно сделать если время будет
avatar
Большое спасибо! Эту версию точно нужно в стандартную сборку включить :)
avatar
Ухты как симпотично получилось =) Однозначно в следующей версии статистика должна быть такой по умолчанию.
avatar
Решил себе на сайте сделать скрываемые блоки (прямой эфир, облако тегов и т.д.)
Столкнулся вот с какой проблеМММой…

У ссылки «свернуть-развернуть» есть указатель текущего состояния блока ()

В функции есть проверка параметра, которая и заствляет принимать правильное значение этому указателю


                if (start == '-105px') {
                        statSlider.open = false;
                }

По этой высоте «105» вычисляется указатель свернутого или развернуто окошка
Данные берутся отсюда
#stat_bg #slider_content { height:90px; padding-top:15px; }

90+15=105

А теперь вопрос:
Как заставить указатель работать правильно, если у блока нет фиксированной высоты? (облако тегов и прямой эфир не имеют фиксированной высоты)
avatar
Попробуйте заменить строчку:
if (start == '-105px') {
на:
if (start != '0px') {
avatar
Спасибо, сработало! :)
avatar
Прикрутил эту красоту и не могу наиграться :) Особое спасибо за слайдер с куками, а то в инете так и не удалось найти готового решения с запоминающимся состоянием.
Вы случайно свой блог не ведете?
avatar
Зараза еще та, сам долго игрался =) Блог не веду из-за нехватки времени на энто дело, хотя хотелось бы) Возможно когда-нибудь заведу.
avatar
Ясно) Мне кажется вас интересно было бы читать)
avatar
хмм. поставил ругается строчка «максимальное»
Fatal error: Call to undefined function memory_get_peak_usage() in /var/www/blablabla/data/www/blablabla/index.php on line 102
avatar
Какая версия PHP? Если я не ошибаюсь, до версии 5.2.1 memory_get_peak_usage() работала только при условии, что PHP собран с опцией --enable-memory-limit.
avatar
прикрутил, но почемуто на некоторых страницах (в частности в блогах и на главной) статистика постоянно открыта, и нет стрелочки чтобы скрыть. не подскажите в чём может быть дело?
avatar
Странно, у меня все нормально. Найдите в исходном коде «некоторых страниц» и скопируйте сюда вот этот кусок:
Cookie.write('slider_start', start, {
	domain: '',
	path: '/',
	duration: 30
});
Какие изменения в движке делали? На чистом ЛС глюков не замечено.
avatar
этот кусок кода идентичный тому что вы написали, на всякий случай вот весь скрипт с неработающей страници
window.addEvent('domready', function() {
                var start = Cookie.read('slider_start') || '0px';
                var status = {'true': '↑','false': '↓'};
                var statSlider = new Fx.Slide('slider_content');

                if (start == '-105px') {
                        statSlider.open = false;
                }
                $('slider_content').setStyle('margin-top', start);
                $('slider_status').set('html', status[statSlider.open]);
                $('slider_toggle').addEvent('click', function(e) {
                        e.stop();
                        statSlider.toggle();
                });
                statSlider.addEvent('complete', function() {
                        $('slider_status').set('html', status[statSlider.open]);
                        new Fx.Scroll(window).toBottom();
                        start = $('slider_content').getStyle('margin-top');
                        Cookie.write('slider_start', start, {
                                domain: '',
                                path: '/',
                                duration: 30
                        });
                });
        });


А изменений достаточно много много, в основном модули отсюда, типа админки… Модуль Loader (пока еще не настроеный, на всех страницах подключается дефолтный набор скриптов) мог на это повлиять? еще в самом индексе прописан редирект типа

if((getenv("HTTP_HOST"))!=='xxx') {
Header( "HTTP/1.1 301 Moved Permanently" ); 
Header( "Location: http://xxx$_SERVER[REQUEST_URI]" );
}
avatar
Попробуйте временно убрать редирект, чтобы проверить в нем ли дело. Почему-то мне кажется (*перекрестился*), что дело именно в нем.
avatar
Поставил. Всё работает. Тенкс.
avatar
Как сделать, чтобы исходное положение было свёрнутым?
avatar
Так это под 0.3 версию. В 0.4 по другому всё.
Как ты поставил?)
avatar
Я пользуюсь 0.3.1.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.