Эта тема на forum.dklab.ru


Maus: Профайлинг php скрипта с использованием xDebug
Дмитрий Котеров: полностью автоматическое решение для XDebug
(Комментарии по использованию - прямо в коде на английском. Вообще, надо сказать, что в профайлер по качеству просто отменный! Zend Studio нервно курит в углу.)

<?php
//
// This file allow to profile PHP code using XDebug profiler.
//
// Usage is simple:
// 0. Download XDebug DLL for your PHP version: http://www.xdebug.org/, then
// add to php.ini:
// zend_extension_ts="/usr/local/php/extensions/php_xdebug-2.0.0rc1-4.4.1.dll"
// xdebug.profiler_enable_trigger=On
// ; xdebug.profiler_output_name="pid" - for old xdebug versions - uncomment this line!
// 1. Copy current file somewhere (e.g. /usr/local/apache2/errors/xdebug.php).
// 2. Modify httpd.conf:
// php_value auto_prepend_file /usr/local/apache2/errors/xdebug.php
// 3. Install WinCacheGrind (http://sourceforge.net/projects/wincachegrind/)
//
// To start profiling of ANY PHP script:
// 1. Open some script in the browser and append "?XDEBUG_PROFILE=1" to its URL.
// 2. "Save as..." window will open, you should choose "Open with application..."
// and add association between cachegrind.out (*.out) and WinCacheGrind.
// 3. WinCacheGrind will be started, and you may watch profiling results in
// superior interface! If you will not close WinCacheGrind, you may open more
// and more profiling results in the same window (different tabs).
//

function __xdebug_profiler_helper()
{
// Do we need to dump cachegrind.out?
$profiling = isset($_GET['XDEBUG_PROFILE']);
$outdir = ini_get('xdebug.trace_output_dir');
if ($outdir) {
if ($pid = @$_GET['XDEBUG_PID']) {
$cachegrind = "cachegrind.out";
$path = "$outdir/$cachegrind.$pid";
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=\"$cachegrind\"");
ob_start('ob_gzhandler'); // great speedup!
echo file_get_contents($path);
unlink($path);
exit();
}
}

// Drop "Save as" window if needed.
if ($outdir && $profiling) {
function __xdebug_profiler_saveas()
{
$pid = getmypid();
echo "<script language='JavaScript'>setTimeout(function() { document.location = '?XDEBUG_PID=$pid' }, 100)</script>";
}
register_shutdown_function('__xdebug_profiler_saveas');
}
}

__xdebug_profiler_helper();
?>



Maus: ручная инсталляция с разъяснениями

// Собственно, вся информация есть на xdebug.org- здесь по-русски, для PHP4 в составе Денвера под WinXP и частично.
Итак, есть библиотека xDebug, разработчиком которой является Дерик Ретанс (Derick Rethans, http://www.derickrethans.nl/ ). Здесь рассматривается только версия 2.0 - так как под Windows по умолчанию скачивается именно она. На текущий момент доступна 2.0.0beta5.

1) скачиваем библиотеку с оф.сайта, кладем куда-нибудь (я переименовал в php_xdebug.dll и положил в /usr/local/php/extensions , чтоб не мучаться с путями)
2) добавляем в php.ini строчки:

; Эту строчку разместил после всех extension =
; чтобы при необходимости без труда найти
; при размещении в произвольной папке может потребоваться указать полный путь
zend_extension_ts=php_xdebug.dll

; Эти строчки разместил в секции [Debugger] - тоже только для удобства
xdebug.profiler_enable = 1 ; 0 - для отключения профайлинга
; папка для результатов профайлинга
; при отсуствующей опции у меня подставилось /tmp
; если папки не существует, автоматом она не создастся и результатов
; Вы не получите
xdebug.profiler_output_dir = /tmp/xdebug

Перезапускаем Денвер, убеждаемся через phpinfo(), что все подключилось. Для просмотра результатов профайлинга автор рекомендует использовать WinCacheGrind - это windows-аналог некой KDE-шной утилиты. Бесплатно, распространяется под GNU GPL v.2
Как она показывает результат профайлинга - см.скриншот. Прочерки - у функций, исполнение которых заняло менее 1мс. Из вывода их можно скрыть фильтром.

Замечания:
1) профилируется любой скрипт при включенной опции xdebug.profiler_enable в php.ini . Для отключения переключаете в 0 и рестартуете Денвер. В xdebug версии 1.3 профайлинг включался вручную, теперь это не поддерживается: по словам автора, это работало слишком медленно
ilich: Re: Профайлинг php скрипта с использованием xDebug
2) добавляем в php.ini строчки:

; Эту строчку разместил после всех extension =
; чтобы при необходимости без труда найти
; при размещении в произвольной папке может потребоваться указать полный путь
zend_extension_ts=php_xdebug.dll



у меня заработало после изменения zend_extension_ts на extension (версия php 4.4.0)
Maus:
ilich
Оригинально, строчка-то взята с оф.сайта.
у меня заработало сразу (PHP 4.4.3-dev, билд Feb 10 2006 14:13:29)
Maus:
Еще замечание:
2) xDebug, похоже, подменяет собой стандартный анализатор ошибок - потому как я внезапно стал наблюдать вместо обычных нотисов вот такие оригинальные таблички (см. скриншот)
Использованный код:
<?php
function tst()
{
$a = jamm();
return $a>2 ? 'A' : 'B';
}
function jamm () {
echo $i;
return false;
}
$w = tst();
$str = mysql_fetch_assoc($w);
if (5>4) trigger_error('kaboom!', E_USER_ERROR);
?>
Дмитрий Котеров:
Я решил все-таки изменить первый пост данного топика, а не писать новый, чтобы автоматическое решение было сразу на виду.

Замечу, что XDebug, похоже, в настоящий момент единственный работающий профайлер из бесплатных (в DBG профайлер есть только в платной версии, а ZendStudio еще более платна, к тому же там профайлер жуть как неудобный). К тому же он по качеству тоже самый лучший из тех, что я пробовал.
Kupuyc:
Доброго времени суток. Господа, а никто не сталкивался с неудобством ввиду подмены библиотекой работы var_dump? Теперь когда выводишь ее содержимое в файл (или в pre) рассмотреть дамп переменной чрезвычайно трудно. Поглядел в доках библиотеки и не нашел способа изменить это поведение на обычное...
Дмитрий Котеров:
Ищите вот тут: http://www.xdebug.org/docs-settings.php#debugger
http://www.google.ru/search?hs=Hlo&hl=ru&client=firefox-a&rls=org.mozilla%3Aru%3Aofficial&q=xdebug+var_dump+disable&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
Наверняка должна быть настройка соответствующая.

Попробуйте еще:
ini_set('html_errors', '0');
Kupuyc:
Да, html_errors пожалуй решение, хоть и не полностью - фича описанная Maus также перестает функционировать. Впрочем это все же выход, благодарю.
Anonymous:
Доброго времени суток всем. Господа кто знает почему php ругается на то что функции не существуют xdebug_memory_usage() и xdebug_peak_memory_usage(), в то время как в документации они упомянуты. В чем проблема я чегото не допонял или в документации что-то попутали. Использую последний базовый пакет денвера с php 5,1,6 и xdebug2. Зарание спасибо.
Maus:
Гость
что-то мне подсказывает, что эти функции есть только в случае, если есть функции memory_get_usage() / memory_get_peak_usage() , а официальные бинарники под Windows собираются без них
Anonymous:
#maus
похоже так и есть :/ спасибо за отклик.
elpaso:
Всем привет
Заинтересовался xDebug, но сразу он у меня не заработал
Чтобы в будущем вы не наступали на грабли как я, проверьте установлен ли у вас zend optimizer
с ним в паре xDebug не работает, так что его нада отключать
jonjonson:
Доброго времени суток. Господа, а никто не сталкивался с неудобством ввиду подмены библиотекой работы var_dump? Теперь когда выводишь ее содержимое в файл (или в pre) рассмотреть дамп переменной чрезвычайно трудно. Поглядел в доках библиотеки и не нашел способа изменить это поведение на обычное...
В принципе поведение можно исправить написанием обёртки :)

function getStripTagedVarDump($var)
{
ob_start();
var_dump($var);
$a = ob_get_contents();
ob_end_clean();
return strip_tags($a);
}
// Пример использования
echo "<pre>";
echo getStripTagedVarDump($GLOBALS);
echo "</pre>";

Для var_dump() в xdebug есть три ограничения http://www.xdebug.org/docs/display
Выключение ограничений осуществляется в настройках php.ini так:
xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1

Yaroslav Vorozhko: Немогу запустить Wincachegrind с xdebug
Помогите решить проблему. Немогу запустить Wincachegrind с xdebug.
Wincachegrind пишет error 21.
А внутри файла, следующие ошибки


<br />
<font size='1'><table border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Warning: file_get_contents(/tmp/cachegrind.out.3560) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: No such file or directory in C:\var\www\xdebug.php on line <i>37</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>66704</td><td bgcolor='#eeeeec'>{main}( )</td><td title='C:\var\www\xdebug.php' bgcolor='#eeeeec'>..(null)<b>:</b>0</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>66704</td><td bgcolor='#eeeeec'>__xdebug_profiler_helper( )</td><td title='C:\var\www\xdebug.php' bgcolor='#eeeeec'>..(null)<b>:</b>54</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0010</td><td bgcolor='#eeeeec' align='right'>109072</td><td bgcolor='#eeeeec'><a href='http://www.php.net/file_get_contents' target='_new'>file_get_contents</a>
( )</td><td title='C:\var\www\xdebug.php' bgcolor='#eeeeec'>..(null)<b>:</b>37</td></tr>
</table></font>
<br />
<font size='1'><table border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Warning: unlink(/tmp/cachegrind.out.3560) [<a href='function.unlink'>function.unlink</a>]: No such file or directory in C:\var\www\xdebug.php on line <i>38</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>66704</td><td bgcolor='#eeeeec'>{main}( )</td><td title='C:\var\www\xdebug.php' bgcolor='#eeeeec'>..(null)<b>:</b>0</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0008</td><td bgcolor='#eeeeec' align='right'>66704</td><td bgcolor='#eeeeec'>__xdebug_profiler_helper( )</td><td title='C:\var\www\xdebug.php' bgcolor='#eeeeec'>..(null)<b>:</b>54</td></tr>
<tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0012</td><td bgcolor='#eeeeec' align='right'>109624</td><td bgcolor='#eeeeec'><a href='http://www.php.net/unlink' target='_new'>unlink</a>
( )</td><td title='C:\var\www\xdebug.php' bgcolor='#eeeeec'>..(null)<b>:</b>38</td></tr>
</table></font>

Maus:
Yaroslav Vorozhko
И каковы же Ваши предположения по поводу случившегося? (Я вот по тексту вижу вполне осмысленные сообщения об ошибках. Но не вижу, что Вам помешало привести их в удобочитаемый вид)
Умкус:
Доброго дня, господа. Не получается уже несколько дней завести Xdebug. Вынужден прибегнуть к вашей помощи.
Пробовал разные настройки, впоследствии, для чистоты эксперимента, вернулся к заводским+.
В конец php.ini вставил:

[xdebug]
zend_extension_ts="D:/wamp/php/ext/php_xdebug.dll"
xdebug.profiler_enable = 1
xdebug.profiler_output_dir = "D:/wamp/tmp/debug"
xdebug.trace_output_dir = "D:/wamp/tmp/debug" ; я на винде


получаю следующую ошибку:
Warning: unlink(D:/wamp/tmp/debug/cachegrind.out.752) : Permission denied in D:\wamp\www\xdebug.php on line 41
Файл находится
Гугль не сильно радовал ответами. Буду благодарен за ответ.
dimagolov:
при чем тут гугль? вы читать и понимать сообщение пытались? у скрипта xdebug.php не хватает прав удалить файл D:/wamp/tmp/debug/cachegrind.out.752. Что тут непонятного?
Anonymous:
Правда? Я это понял, как только увидел сообщение.
Читать умею, с английским все в порядке. Ответ из разряда "Дядя у вас сломался автобус" :). Но всеж спасибо, как и обещалось.
Может не так вопрос поставил, попробую конкретно: какие могут быть проблемы с доступом в винде, и как их обойти конкретно в данной ситуации?
Перекинул папку в корень DocumentRoot'а, не помогло.
Заметил, что отказано в доступе на удаление файла именно с этим именем, то же файл, с измененным именем удаляется на ура. Апач перезагружается, генерируется новое имя... и т.д.
Вручную все перкрасно удаляется.
Умкус:
Убрал auto_prepend_file и xdebug.php туда же. Сгенерированные файлы открываю вручную — по необходимости. Хватит и этого. Умолкаю.
Anonymous:
Доброго времени суток всем. Господа кто знает почему php ругается на то что функции не существуют xdebug_memory_usage() и xdebug_peak_memory_usage(), в то время как в документации они упомянуты. В чем проблема я чегото не допонял или в документации что-то попутали. Использую последний базовый пакет денвера с php 5,1,6 и xdebug2. Зарание спасибо.
Посмотри, какие функции объявлены

<?php
echo '<pre>';
print_r( get_defined_functions() );
echo '</pre>';
?>

stfalcon:
var_dump можно отключить установив в конфиге
xdebug.overload_var_dump=0
bæv:
Ветка выделена в отдельную тему «я не знаю что такое профайлинг»,
расположенную в форуме Лень сходить в Поиск или почитать документацию (18 Ноября 2008, 02:54).
Mindfinder:
У меня WinCacheGrind время выполнения делит на 10, т.е. в 10 раз меньше реального. Есть еще какие-нибудь бесплатные программы для просмотра профилей?
Aggtaa:
У меня WinCacheGrind время выполнения делит на 10, т.е. в 10 раз меньше реального. Есть еще какие-нибудь бесплатные программы для просмотра профилей?
WebGrind. Бесплатно, менее глючно и (мне) более удобно, чем WinCacheGrind. Если в папке с трейсами много файлов, то первый раз долго открывается. Потом все пучком
http://code.google.com/p/webgrind/
Seneka:
WebGrind - неудобно использовать, хотелось-бы какое-нибудь приложение под windows
Corneliy:
А WinCacheGrin есть свежие версии, или на проект забили?
Maus:
Corneliy
а они нужны?
dopos:
WebGrind . Бесплатно , менее глючно и (мне) более удобно , чем . Если в папке с трейсами много файлов , то первый раз долго открывается . Потом все пучком

да спасибо
KoteProf:
Всем привет видеооператор
Заинтересовался xDebug, но сразу он у меня не заработал
Чтобы в будущем вы не наступали на грабли как я, проверьте установлен ли у вас zend optimizer
с ним в паре xDebug не работает, так что его нада отключать
Да, у меня на хостинге он был просто отключён, хотя в списке присутствовал. Тоже намучилась из-за невнимательности... :)
Munawar84: fully automatic solution for the XDebug
Good solution.

Эта тема на forum.dklab.ru