Попробовал модуль devel, так много оказывается обращений к базе, на каждой странице "время исполнения страницы" меньше чем 362.76 ms вообще не было (при открытии форумов), на любой другой страницы 460-560 или больше... это нормально? или много?
на других сайтах встречал такое обозначение: Page execution time : 0.00019097328186035 ms
сколько это будет и какая разница?
Комментарии
Попробовал у себя.
Сначала посыпала куча строк типа
Notice: Undefined index: бла бла бла
Page execution time за 4000 ms перевалил
Далее для тех кто в танке и на Денвере
Чтобы такого небыло надо в php.ini закомментировать строку
error_reporting = E_ALL ; & ~E_NOTICE
и раскомментировать
error_reporting = E_ALL & ~E_NOTICE
После этой процедуры:
Executed 353 queries in 670.7 milliseconds. Page execution time was 1715.34 ms.
У меня тоже большие величины этого дела были и запросов на страницу по 3-4 сотни. В общем виновытым оказался я сам
Во-первых, покривил таблицу кэша, отчего у меня кажная страница строилась без его участия.
Во-вторых, мои самописные модули были не очень правильно написаны. Переделал (в основном ввел кэширование) отчего среднее кол-во запросов к БД снизилось до 25-40 (примерно) на страницу. Время генерации, соответствено, упало и памяти под MySQL с PHP стало уходить меньше. (Это было на Дрюпале 4.6, модулей было где-то в районе 38-и; на drupal.htdogs.ru, кстати, это обсуждалось, если интересно).
Вообще devel-ом просматривать это хорошо, но ещё и профайлер помогает (я пользую XDebug + WinCacheGrind) - очень хорошо видно куда время девается. Для Дрюпала 4.6, например, очень большая часть его уходит на период инициализации (наверное поэтому в 4.7 это дело на несколько ступеней разблили) и "отрисовку" страницы (тут в основном из-за блоков).
Разумеется, то что я сказал верно для моего случая, у Вас это может быть и не так.
я вообще не об этом, а о том, что на некоторых сайтах Page execution time : 0.00019097328186035 ms, а на Друпале Page execution time was 2696.98 ms... и это не на Денвере а на хостинге...
Печальная статистика... А примеров подкиньте, что б глянуть где такая отдача?
Отвечая на Ваш вопрос: Page execution time == 2696.98ms - это ненормально, это многовато. Хотя тут многое "зависит от". Настройки Дрюпала глянуть надо, сервера (как HTTP, так и DB)...
я пробовал devel модуль, проблема ещё в том, что сам этот модуль также себя считает, поэтому конечно, не всё так плохо, но иногда идёт большая задержка перед открытием страницы...
и ещё, если кэш отключен, то Друпал каждый раз в него что-то добавляет, если включен, то не каждый раз, а изредка... (у меня отключен), вот и получается, что на некоторых страницах так много, хотя 2696.98ms это максимум, обычно 596.98ms (это на обычной странице, где не слишком много информации), но я не проверял на страницах добавления комментариев, а они иногда вообще по несколько секунд ничего не отвечают...
На китайских дешёвых магнитофонах написано: 200 Ватт, а на моих старых советских немаленьких колонках - 40 Ватт. Надо ли говорить, что это совершенно разные цифры?
Сначала нужно разобраться, что означает каждая из цифр, а потом уже и сравнивать.
да, нас дурят разработчики всех скриптов... это заговор...
Вот для того, что бы разобраться, что там за цифры нарисованы, я и попросил уважаемого B.X пару ссылок на эти странички...
2B.X: Ссылки можете предоставить?
все тесты проводил на своём сайте с включённым модулем, devel... я его удалил, так что сейчас нет возможности... да и зачем? если просто потестить, так для этого любой Друпал подойдёт... у них у всех примерно одинаковая загрузка на всех сайтах (если модулей стандартное кол-во), но если сайт оптимизирован и выкинуто всё лишнее, тогда - нет...
Я имел ввиду ссылки вот на эти сайты...
Вот например http://e107.org.ru/
Страница создана за: 0.4100 секунд(ы) (410 мс). SQL запросов: 56.
Это не 160 запросов, как в друпале и время очень отличается. Хотя сам e107 мне не нравится....
Вообще старанен сам факт того, что для определения такой простой вещи требуется ИНСТАЛИРОВАТЬ целый модуль.
Это конечно прикол ещё тот...
Наверно разработчики Друпала любят трудности
Про devel.module: вообще говоря, модуль этот предназначен для разработчиков и показ времени это одна из его фич (не самая важная).
Время генерации можно посмотреть и другими способами: начало отработки сам Дрюпал фиксирует и можно прямо в теме считать и выводить это время.
Не скажи. Этот модуль тоже жрёт ресурсы и если тебе время генерации страницы не нужно, зачем расходовать ресурсы понапрасну.
[b]на других сайтах встречал такое обозначение: Page execution time : 0.00019097328186035 ms[/b]
если честно, я уже и не помню, где я это нашёл, просто забил в Яндексе "Page execution time" и он мне выдал результаты...
[b]можно прямо в теме считать и выводить это время[/b]
не подскажете как? что прописывать (код), куда?
Я наверное погорячился с утверждением, что прописать можно прям в page.tpl.php Т.е. прописать туда можно и получить результат можно, но точнее он будет, если производить подсчёт в hook_exit().
Итак, идём в devel.module, копируем оттуда код ф-ции
devel_timer()
и далее у нас 2 варианта:$footer_message
вpage.tpl.php
global $timer;
list($usec, $sec) = explode(' ', microtime());
$stop = (float)$usec + (float)$sec;
$diff = round(($stop - $timer) * 1000, 2);
print t(' Page execution time was %time ms.', array('%time' => $diff));
} ?>
частично решилось периодической оптимизацией таблиц, но всё равно до конца от тормозов избавиться не удалось. На слабых машинах тормозит даже с 2-3мя страницами контента, практически без доп. модулей.
насколько я знаю, самый затратный из всех стандартных мрдулей - это форум... так же постоянно грузятся модули block и locale... что ещё? на хостинге Servage есть-таки акселератор для PHP, что меня и спасает (сайт открывается достаточно быстро, засчёт кэширования вывода скриптов), но что на других хостингах без этого делается - не знаю, для Друпала всё-таки нужен или отдельный сервер или виртуальный по-возможностям сравнимый с выделенным...
на основном сайте пришлось отключить - выдает ошибку:
gzinflate(): data error in /var/www/drupal/includes/bootstrap.inc on line 532
по ощущению, возникает, если на одну и ту же страницу ходить попеременно Iexplorer'ом и Firefox'ом
кое-как справляюсь за счет собственноручно написаного вывода основного контента. В последнее время мне временами кажется, что в 4.7 поставили какую-то "закладку" для создания тормозов и глюков.
Пробовал разбираться в распределении загрузки - на Mysql приходится не так уж много времени, по крайней мере, перенос базы на другую машину ощутимой прибавки скорости не дал. Все тормоза где-то в коде.
то есть,
1. вставляем в район $footer_message в page.tpl.php:
<?php
function devel_timer() {
$time = timer_read('page');
return t(' Page execution time was %time ms.', array('%time' => $time));
}
?>
2. делаем отдельный модуль (включаем его на странице модулей), вставляем в текст модуля только это:
<?php
function pagetime_exit($destination = NULL) {
global $timer;
list($usec, $sec) = explode(' ', microtime());
$stop = (float)$usec + (float)$sec;
$diff = round(($stop - $timer) * 1000, 2);
print t(' Page execution time was %time ms.', array('%time' => $diff));
}
?>
и всё?
[b]Добавлено:[/b]
Ага, понял... один из двух вариантов, то есть или то или это...
создал модуль, работает, можете (кто хочет) посмотреть на моём сайте (ссылка на сайт в профиле)...
[b]Впечатления:[/b]
А ничего так, показывает Page execution time was 1.1575661213E+12 ms.
на главной странице... вроде не так и много...
[b]Ошибки:[/b]
В Мозилле пишет ошибку Fatal error: Call to undefined function: t() in
потому что я в функцию добавил html теги... не знал что так нельзя... в Опере и ИЕ нормально показывает...
Да - либо так, либо сяк. Вариант "так" (это который 1) - не совсем точный, тогда как второй вариант - немного точнее - он учитывает некоторые действия Дрюпала после формирования (выдачи?) страницы.
Хм.. что-то у меня не так (в смысле, не в таком формате выводит).
Да это ж серверная ошибка, от браузера не зависит. И ругается-то на "неопределённую ф-цию", может просто параметры при вызове напутали?
[b]"Да это ж серверная ошибка, от браузера не зависит."[/b]
выходит что зависит...
во всяком случае, в Опере и ИЕ её ни разу не видел (смотрю сейчас все страницы), а в Мозилле иногда (очень редко) всё показывается нормально, а обычно показывает ошибку... можете сами посмотреть...
от хтмл не зависит, убрал хтмл, весь ваш код который на странице показан включил и вот в Мозилле всё равно эта ошибка... хм...
[b]Хм.. что-то у меня не так (в смысле, не в таком формате выводит).[/b]
а в каком?
зависит наверное от настроек сервера...
вот, можете [url=http://harzah.net]здесь[/url] посмотреть...
Да не - не дОлжно так быть. Скорее всего это из-за кэширования. Я сейчас сходил-глянул и у меня это всё время показывается (я зашёл Оперой, и анонимом, конечно).
Я только сейчас понял вот что: мы с Вами говорим немного о разных вещах: я про Дрюпал 4.6, а Вы - про 4.7
Начнем с того, что в 4.7 модуль будет вот такой:
function pagetime_exit($destination = NULL) {
print t('Page execution time was %time ms.'
, array('%time' => timer_read('page')));
}
?>
У меня работает.
Тут я вообще не пойму в чем причина: вроде ж t(..) определена в
common.inc
...t имхо некчему, хотя конечно так правильно. можно просто написать print 'время загрузки' $diff зачем нам перевод запрашивать?
то есть, можно просто print 'Page execution time was %time ms.'?
сейчас попробую...
просто раньше я уже думал об этом, но если пишу print 'Page execution time was %time ms.', array('%time' => $diff); - у меня выводится ошибка...
В принципе да - можно и без t(), но с ней - идеологичеки более верно. Если без неё, то:
так можно.
просто мне t( не нужно, я перевожу прямо в модулях, без модуля locale... спасибо, сейчас попробую...
[b]Добавлено:[/b]
вот теперь всё работает во всех браузерах...
модуль у меня такого вида:
<?php
function pagetime_exit($destination = NULL) {
global $timer;
list($usec, $sec) = explode(' ', microtime());
$stop = (float)$usec + (float)$sec;
$diff = round(($stop - $timer) * 1000, 2);
print "
";
}
?>
[b]Добавлено ещё:[/b]
Только странно, что цифры почти не меняются: 1.15757354589E+12
и что за Е+12? как должно быть? в devel модуле у меня по-другому показывалось...
Это от того, что для 4.7 по-другому писать надо (см. мой предыдущий пост). Дело в том, что в этом варианте используется
global $timer
, которой нет в 4.7! Там есть массив$timers
вместо этого.А если Вы не используете
t(..)
, и переводите прям в модулях, то может вы её и изcommon.inc
убрали?Ну и в модуле тогда надо писать без неё... Ну да Вы это и так поняли
[b]"Я только сейчас понял вот что: мы с Вами говорим немного о разных вещах: я про Дрюпал 4.6, а Вы - про 4.7"[/b]
хех... понятно, спасибо, а я-то думаю, что за дела...
вот, теперь правильно:
Страница сгенерирована за 1211.62 миллисекунд - это много или мало?
[b]то может вы её и из common.inc убрали[/b]
нет зачем? я просто ищу в модулях t( и перевожу на русский и всё...
[b]Добавлено:[/b]
Или вот ещё больше, главная страница выдала такой результат:
Страница сгенерирована за 3062.95 миллисекунд.
Это значит, что за 1,2 сек. Много это? Я считаю, что это "зависит от". Надо смотреть что за ф-ционал на сайте? Что за модули включены? Что она странице выводится? Ну и в таком духе...
Если просто так, без учета всего этого, то (IMHO) больше секунды на страницу - это много.
Но повторюсь - зависит от очень многих факторов.
Странно тогда, что она у Вас не видится внутри этого модуля (pagetime).
Много это... Попробуйте что-то поменять, например, кэширование включить.
[b]"больше секнды на страницу - это много. Но повторюсь - зависит от очень многих факторов."[/b]
ясно, но в основном, у меня 600.00-500.00, иногда бывают такие задержки, так что можно считать что у меня Друпал быстро бегает... форум долго открывается, если на странице много комментариев (все 10) и текст темы большой, то вот что она показала:
Страница сгенерирована за 4025.05 миллисекунд.
[b]"Странно тогда, что она у Вас не видится внутри этого модуля (pagetime)."[/b]
кто не видится?
Это я про
t()
.хм... сейчас в мозилле всё равно ошибка:
Fatal error: Call to undefined function: t() in /mounted-storage/home20b/sub001/sc20264-XBHE/www/modules/pagetime/pagetime.module on line 3 (раньше в старой версии для 4.6 было на странице 7)... хм... в Опере всё нормально показывается...
[b]Добавлено:[/b]
а без t( как будет?
Да я ж написал: не используйте
t()
, делайте по-своему:И всё.
Например, так:
или
print "Page execution time was {$time} ms.";
Как Вам больше нравится.
спасибо ещё раз, просто для старой версии я понял как, спасибо за примеры, а для новой там всё по-другому, методом аналогии не заменишь... кстати, не хотели бы оформить в модуль и на drupal.org создать проект отдельный? я думаю, многим этот модуль пригодился бы...
Честно говоря, я не думаю, что этот модуль спросом будет пользоваться.
зря вы так думаете, сейчас многие активно переходят на Друпал с других CMS (порталов) в которых этот модуль есть по умолчанию... они-то и будут заинтересованы...
Хорошо - я подумаю над этим
потестировав модуль, увидел, что нормально он работать не хочет... выдаёт ошибку...
Cannot modify header information - headers already sent by (output started at /www/modules/pagetime/pagetime.module:3) in /www/includes/common.inc on line 266.
может можно было сделать модуль, а вывод как-то в тему ввести? а то ошибка нехорошая...
или наплевать на точность и остановиться на
1. вставляем в район $footer_message в page.tpl.php:
<?php
function devel_timer() {
$time = timer_read('page');
return t(' Page execution time was %time ms.', array('%time' => $time));
}
?>
[b]Добавлено:[/b]
не работает эта вставка в page.tpl.php
не показывается...
Это либо Вы где-то пробелы не убрали (после закрывающего '?>', например), либо это следствие каких-то ошибок (предположительно с кешем). У меня модуль стоял и не ругался.
Извините за дурацкий вопрос: а вывод результата вызова
devel_timer()
на печать выводится? Что-то типа:<?php print devel_timer(); ?>
Есть в
page.tpl.php
?[b]"Это либо Вы где-то пробелы не убрали"[/b]
специально проверил, пробелов ни до пхп-скрипта, ни после не было...
зато после закрывающего тега хтмл у меня был div, ваш код вставляется после всех тегов, а я хотел его изменить визуально и добавил теги div до и после текста... кэш выключен... то есть так:
<?php
function pagetime_exit($destination = NULL) {
print '
';
}
?>
[b]"Извините за дурацкий вопрос: а вывод результата вызова devel_timer() на печать выводится? Что-то типа:
<?php print devel_timer(); ?>
Есть в page.tpl.php?"[/b]
нет, конечно... об этом вы раньше не упоминали...
или упоминали, но я не понял...
[b]Добавлено:[/b]
да, если это добавить, то всё нормально... работает...
интересно, вывел для предыдущего модуля (тот что оформлен в модуль) по такому же типу
<?php print pagetime_exit($destination = NULL); ?>
(чтобы ввести до закрывающего html тега), так теперь две надписи показывает, ту, что я вывел и ту что сама выводится из модуля... хм...Смысла я особо не понял, но в любом случае небольшой ликбез по PHP (просто на будущее): в данном примере выполняется вызов ф-ции
pagetime_exit(..)
и тут лучше писать вот так:<?php print pagetime_exit(NULL); ?>
(без
$destination
)да, но тогда две надписи появляется, одна прямо из модуля, а вторая из вывода файла page.tpl... да я ставил и без $destination, но разницы в пвботе не заметил...
Да - так и есть. Вы же сами и туда и сюда вставили этот вывод. Что ж тут удивительного?
<?php print pagetime_exit($destination = NULL); ?>
тоже самое, что и
<?php print pagetime_exit(NULL); ?>
Разница в том, что в втором случае сразу вызывается ф-ция с параметром NULL, а в первом, сначала переменной присваивается значение NULL, затем вызывается вызывается функция с параметром $destination, равным NULL. Таким образом результат работы обоих вариантов одинаков. Но лучше использовать вариант 2, т.к. он (в данном случае!) понятней.
Во! Именно это я и хотел сказать Спасибо!
а тогда что надо вставить в модуль? если вывод сделать в page.tpl?
например выводим в page.tpl:
<?php print pagetime_exit(NULL);?>
а в код pagetime.module из этого что тогда:
<?php
function pagetime_exit($destination = NULL) {
print '
';
}
?>
Или, если "или в модуле или в page.tpl", то что тогда в модуле прописать, чтобы он выводил, скажем, сразу после футера, но до закрывающего боди тега?
Тогда можно сделать так:
function pagetime_exit($destination = NULL) {
return '<div class=page_exec>Страница сгенерирована за '.timer_read('page').' миллисекунд.</div>';
}
?>
Но тогда весь смысл модуля теряется и Вы можете смело этот код перенести в целиком в
page.tpl.php
.Что бы Вы лучше понимали картину, происходит приблизительно следующее: страница формируется ("отрабатывает" код, внутри
page.tpl.php
) и Дрюпал сохраняет/выводит всё содержимое страницы. И только после этого дёргаетhook_exit
.А поскольку
pagetime.module
реализует именноhook_exit
, то и вывод этого модуля (<?php print ... ?>
) попадает уже после всего содержимого страницы. Но зато мы имеем почти полное время генерации страницы (== отработки Дрюпала).В случае же, если Вам надо вывод времени генерации поместить именно внутрь тэга BODY, то у Вас несколько вариантов:
page.tpl.php
и мириться с тем, что выводимое время у Вас - не полное (ха! тут можно вручную замерить усреднённо этот недостающий кусок и просто прибавлять его при выводе изpage.tpl.php
минимизировав таким образом различие!<?php function pagetime_exit(..){..} ?>
поменять на<?php function pagetime_footer($main = 0){..} ?>
) и опять же мириться с тем, что время не полное.pagetime.module
в обработчикеhook_footer
формируем случайное число и выдаём в качестве результата работы хука, что то типа:<script language="javascript" src="[случайное число].js"></script>
hook_exit
не выводим ничего, в замеряем время и сохраняем его в файл с именем, сформированным с использованием того случайного числа и с расширением ".js" ("[случайное число].js"); внутри будет что-то типа:showTime([time]);
, где [time] - это и есть время.
Теперь надо побеспокоиться о том, что бы эти временные JS-файлики убивать периодически (добавляем обработку
<?php pagetime_cron(..) {..} ?>
).Всё! Теперь при формировании страницы, у нас сгенерируется JS-файл с искомым временем, а при загрузке страницы, это время попадёт в нужное место страницы.
DISCLAIMER: это всё придумывал щас на ходу, что-то может не продумал... может не сразу сработает. Не ругайте
Вот так, приблизительно, обстоят дела...
мда, как всё сложно... есть ещё один вариант, конечно...
убрать из page.tpl закрывающие теги body и html и ввести их в модуль pagetime. Он же на всех страницах последний? Тогда ошибки показывать не будет...
Совсем не факт, что он последним будет отрабатывать. А если ещё будет какой-то модуль, который вздумает писать что-то в обработчике hook_exit? Да и вообще не очень "правильный" подход с точки зрения архитекруты (всё же я бы предпочел не смешивать логику и представление...).
Само собой, что Вы можете это применить, но штука эта весьма специфическая и надо ещё внимательно глянуть - не порушит ли она чего-нибудь.