<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Разработка &#187; отладка</title>
	<atom:link href="http://www.job-blog.bullgare.ru/tag/%d0%be%d1%82%d0%bb%d0%b0%d0%b4%d0%ba%d0%b0/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.job-blog.bullgare.ru</link>
	<description>о программировании и работе</description>
	<lastBuildDate>Fri, 03 Feb 2012 09:42:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Трассировка PHP-приложений с помощью xdebug</title>
		<link>http://www.job-blog.bullgare.ru/2010/07/%d1%82%d1%80%d0%b0%d1%81%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-php-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-xdebug/</link>
		<comments>http://www.job-blog.bullgare.ru/2010/07/%d1%82%d1%80%d0%b0%d1%81%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-php-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-xdebug/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 10:37:46 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[xdebug]]></category>
		<category><![CDATA[отладка]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=748</guid>
		<description><![CDATA[Вот достаточно подробная статья на эту тему. В принципе достаточно написать xdebug_start_trace('&#60;Путь-к файлу&#62;.html', XDEBUG_TRACE_HTML); ... ... xdebug_stop_trace();]]></description>
			<content:encoded><![CDATA[<p>Вот достаточно подробная <a href="http://habrahabr.ru/blogs/php/31463/">статья</a> на эту тему.<br />
В принципе достаточно написать</p>
<pre class="code">
xdebug_start_trace('&lt;Путь-к файлу&gt;.html', XDEBUG_TRACE_HTML);
...
...
xdebug_stop_trace();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2010/07/%d1%82%d1%80%d0%b0%d1%81%d1%81%d0%b8%d1%80%d0%be%d0%b2%d0%ba%d0%b0-php-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9-%d1%81-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d1%8c%d1%8e-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FirePHP. Начало;)</title>
		<link>http://www.job-blog.bullgare.ru/2009/12/firephp-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/12/firephp-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 12:23:34 +0000</pubDate>
		<dc:creator>bullgare</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[отладка]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=517</guid>
		<description><![CDATA[На офсайте нажимаем на &#171;Get FirePHP&#187;. Далее скачиваем серверную часть. Потом её каким-нибудь образом встраиваем в проект. К примеру (коллега такое сделал): public static function fb() { if (!ob_get_level()) { ob_start(); } $instance = FirePHP::getInstance( true ); $args = func_get_args(); return call_user_func_array( array( $instance, 'fb' ), $args ); } Собственно всё &#8211; после этого в [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.firephp.org/">На офсайте</a> нажимаем на &laquo;Get FirePHP&raquo;.<br />
Далее <a href="http://www.firephp.org/HQ/Install.htm">скачиваем серверную часть</a>.<br />
Потом её каким-нибудь образом встраиваем в проект. К примеру (коллега такое сделал):</p>
<pre class="code">
	public static function fb()
	{
		if (!ob_get_level()) {
			ob_start();
		}

		$instance = FirePHP::getInstance( true );

		$args = func_get_args();
		return call_user_func_array( array( $instance, 'fb' ), $args );
	}
</pre>
<p>Собственно всё &#8211; после этого в консоли будет удобный вывод всяких массивов и т.п. (например, при обращении к <>::fb( array(1,2,3) ) )</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/12/firephp-%d0%bd%d0%b0%d1%87%d0%b0%d0%bb%d0%be/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Профилирование php-проекта: Xdebug</title>
		<link>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 11:47:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[серверная оптимизация]]></category>
		<category><![CDATA[bottle-neck]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[xdebug]]></category>
		<category><![CDATA[бутылочное горлышко]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=240</guid>
		<description><![CDATA[Установка Скачать После помещения библиотеки в папку с расширениями в php.ini надо написать zend_extension = \ext\php_xdebug.dll Далее ставим плагин для firefox &#8211; Xdebug Helper, настройка всего инструментария &#8211; в базе знаний Google Работа с Xdebug под Eclipse ещё про установку и настройку xdebug, Профилирование с Xdebug на habrahabr. Самое основное &#8211; параметр в php.ini xdebug.profiler_enable_trigger=On [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.xdebug.org/docs/install">Установка</a><br />
<a href="http://www.xdebug.org/download.php">Скачать</a><br />
После помещения библиотеки в папку с расширениями в <em>php.ini</em> надо написать</p>
<pre class="code">
zend_extension = <путь-к-php>\ext\php_xdebug.dll
</pre>
<p>Далее ставим плагин для firefox &#8211; <a href="https://addons.mozilla.org/ru/firefox/addon/3960">Xdebug Helper</a>, настройка всего инструментария &#8211; <a href="http://code.google.com/p/syslogr-utils/wiki/XdebugHelper">в базе знаний Google</a><br />
<a href="http://www.phpeclipse.com/wiki/Howto/XDebugAndPHPEclipse">Работа с Xdebug под Eclipse</a><br />
ещё про установку и <a href="http://www.ibm.com/developerworks/ru/library/os-php-xdebug/index.html">настройку xdebug</a>,<br />
<a href="http://habrahabr.ru/blogs/php/31468/">Профилирование с Xdebug на habrahabr</a>.<br />
Самое основное &#8211; параметр в php.ini</p>
<pre class="code">
xdebug.profiler_enable_trigger=On
</pre>
<p>В итоге у меня получилось (php5.3)</p>
<pre class="code">
zend_extension = путь-к-php53\ext\php_xdebug.dll
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.idekey=default

;xdebug.dump_once = On
;xdebug.dump_globals = On
;xdebug.dump_undefined = On
;xdebug.dump.REQUEST = *
;xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

xdebug.profiler_enable=Off
xdebug.profiler_output_dir="c:\traces"
xdebug.profiler_enable_trigger=On
xdebug.profiler_output_name = cachegrind.out.%t.%p
</pre>
<p>Теперь достаточно передать в GET-параметре <em>?XDEBUG_PROFILE</em> (вот как раз тут полезен XdebugHelper &#8211; там это можно включить для определённого сайта).<br />
<a href="http://tigor.com.ua/blog/2008/07/21/php-profiler-debugger-xdebug/">много ссылок на полезные статьи</a>.<br />
<a href="http://code.google.com/p/webgrind/">Инструмент для анализа логов Xdebug</a> от создателя.</p>
<p><a href="http://forums.netbeans.org/post-9585.html"><strong>Дебаг проекта</strong> через NetBeans совместно с XdebugHelper</a>:<br />
запустить отладчик в NetBeans и затем нажать кнопку &laquo;run&raquo; (это NetBeans заставит слушать Xdebug), а затем открыть сайт с активированным на нём XdebugHelper&#8217;ом.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0-xdebug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Профилирование php-проекта: APD</title>
		<link>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0/</link>
		<comments>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 12:48:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[серверная оптимизация]]></category>
		<category><![CDATA[APD]]></category>
		<category><![CDATA[bottle-neck]]></category>
		<category><![CDATA[бутылочное горлышко]]></category>
		<category><![CDATA[отладка]]></category>
		<category><![CDATA[профилирование]]></category>

		<guid isPermaLink="false">http://www.job-blog.bullgare.ru/?p=192</guid>
		<description><![CDATA[При разработке сайта под большую нагрузку нужно постоянно искать слабые места в коде. К примеру, при добавлении нового функционала на частопосещаемой странице появился кусок кода (функция, метод), который заметно замедляет работу проекта в целом. Нет пределов совершенству, и проект можно вылизывать до бесконечности, но на что стоит обратить внимание &#8211; подскажет профайлер кода. Лично я [...]]]></description>
			<content:encoded><![CDATA[<p>При разработке сайта под большую нагрузку нужно постоянно искать слабые места в коде. К примеру, при добавлении нового функционала на частопосещаемой странице появился кусок кода (функция, метод), который заметно замедляет работу проекта в целом. Нет пределов совершенству, и проект можно вылизывать до бесконечности, но на что стоит обратить внимание &#8211; подскажет профайлер кода. Лично я использую в работе <a href="http://pecl.php.net/package/apd">APD (Advanced PHP Debugger)</a>. Во-первых, он хранится в репозитории модулей PHP, во-вторых, мне понравилось им пользоваться, в-третьих, у автора есть достаточно подробное описание в <a href="http://www.ozon.ru/context/detail/id/2527057/">книге &laquo;Профессиональное программирование на PHP&raquo;</a>, в-четвёртых, простота использования. Из минусов &#8211; давно не обновлялся и, видимо, уже заброшен разработчиком.<br />
<strong>Установка</strong> производится с помощью инсталлятора PEAR</p>
<pre class="code">
#pear install apd
</pre>
<p>После чего в файл php.ini необходимо добавить установленное расширение и произвести настройку. (Приведу для примера параметры для Windows)</p>
<pre class="code">
zend_extension = <Путь к установленному php>\ext\php_apd.dll
apd.dumpdir = c:\apd_traces\ ; здесь будут храниться промежуточные файлы трассировок
apd.statement_trace = 1
</pre>
<p>Если вызвать phpinfo(), должен появиться раздел с параметрами APD.<br />
<strong>Использование</strong>.<br />
Активизируется трассировка путём включения в нужный php-файл вызова функции</p>
<pre class="code">
apd_set_pprof_trace('c:\TEMP\apd_traces');
</pre>
<p>Протоколируется следующие события:</p>
<ul>
<li>вход в функцию</li>
<li>выход из функции</li>
<li>использование инструкций <em>include</em> и <em>require</em></li>
</ul>
<p>.<br />
При этом ведутся 3 счётчика:</p>
<ul>
<li>Real Time &#8211; прошедшее реальное время</li>
<li>User Time &#8211; время, затраченное на пользовательский код</li>
<li>System Time &#8211; время, затраченное на системные вызовы</li>
</ul>
<p>.<br />
После того, как файлы созданы (т.е. скрипт отработал), можно, к примеру, закомментировать строку вызова</p>
<pre class="code">
apd_set_pprof_trace('c:\TEMP\apd_traces');
</pre>
<p>(она больше не нужна).<br />
При установке APD из репозитория в папке<br />
<em><Путь к php>\PEAR\Console\</em> появится файл <em>pprofp</em>.<br />
Далее можно создать файл, к примеру, <em>run.bat</em>:</p>
<pre class="code">
php.exe pprofp -r c:\TEMP\apd_traces\pprof.00288.53 > c:\TEMP\apd_out_rmT.txt
</pre>
<p>где <em>c:\TEMP\apd_traces\pprof.00288.53</em> &#8211; это промежуточный файл трассировок, созданный при выполнении скрипта, а <em>c:\TEMP\apd_out_rmT.txt</em> будет создан и будет содержать полезную информацию в удобной форме.<br />
Можно, конечно, создать и более &laquo;умный&raquo; батник, котороый бы принимал имя промежуточного файла параметром, но статья не об этом.<br />
В итоге в файле увидим время выполнения функций и количество вызовов, что в дальнейшем должно помочь писать более &laquo;быстрый&raquo; код.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.job-blog.bullgare.ru/2009/09/%d0%bf%d1%80%d0%be%d1%84%d0%b8%d0%bb%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-php-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

