<?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%b1%d1%83%d1%82%d1%8b%d0%bb%d0%be%d1%87%d0%bd%d0%be%d0%b5-%d0%b3%d0%be%d1%80%d0%bb%d1%8b%d1%88%d0%ba%d0%be/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.job-blog.bullgare.ru</link>
	<description>о программировании и работе</description>
	<lastBuildDate>Wed, 08 Feb 2012 09:39:48 +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/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.%R-%t"
</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>

