Попробовал модуль devel, так много оказывается обращений к базе, на каждой странице "время исполнения страницы" меньше чем 362.76 ms вообще не было (при открытии форумов), на любой другой страницы 460-560 или больше... это нормально? или много?
на других сайтах встречал такое обозначение: Page execution time : 0.00019097328186035 ms
сколько это будет и какая разница?
Комментарии
Попробовал у себя.![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Сначала посыпала куча строк типа
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 Ватт. Надо ли говорить, что это совершенно разные цифры?![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Сначала нужно разобраться, что означает каждая из цифр, а потом уже и сравнивать.
да, нас дурят разработчики всех скриптов... это заговор...
Вот для того, что бы разобраться, что там за цифры нарисованы, я и попросил уважаемого B.X пару ссылок на эти странички...
2B.X: Ссылки можете предоставить?
все тесты проводил на своём сайте с включённым модулем, devel... я его удалил, так что сейчас нет возможности... да и зачем? если просто потестить, так для этого любой Друпал подойдёт... у них у всех примерно одинаковая загрузка на всех сайтах (если модулей стандартное кол-во), но если сайт оптимизирован и выкинуто всё лишнее, тогда - нет...
Я имел ввиду ссылки вот на эти сайты...
Вот например http://e107.org.ru/
Страница создана за: 0.4100 секунд(ы) (410 мс). SQL запросов: 56.
Это не 160 запросов, как в друпале и время очень отличается. Хотя сам e107 мне не нравится....
Вообще старанен сам факт того, что для определения такой простой вещи требуется ИНСТАЛИРОВАТЬ целый модуль.![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Это конечно прикол ещё тот...
Наверно разработчики Друпала любят трудности
Про 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![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
Начнем с того, что в 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
убрали?Ну и в модуле тогда надо писать без неё... Ну да Вы это и так поняли![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
[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 создать проект отдельный? я думаю, многим этот модуль пригодился бы...
Честно говоря, я не думаю, что этот модуль спросом будет пользоваться.![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
зря вы так думаете, сейчас многие активно переходят на Друпал с других CMS (порталов) в которых этот модуль есть по умолчанию... они-то и будут заинтересованы...
Хорошо - я подумаю над этим![Wink](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/wink.gif)
потестировав модуль, увидел, что нормально он работать не хочет... выдаёт ошибку...
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? Да и вообще не очень "правильный" подход с точки зрения архитекруты (всё же я бы предпочел не смешивать логику и представление...).
Само собой, что Вы можете это применить, но штука эта весьма специфическая и надо ещё внимательно глянуть - не порушит ли она чего-нибудь.