<?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>Shakaran &#187; PHP</title> <atom:link href="http://shakaran.net/blog/category/PHP/feed/" rel="self" type="application/rss+xml" /><link>http://shakaran.net/blog</link> <description>Blog de un estudiante de ingeniería informática y sysadmin</description> <lastBuildDate>Wed, 25 Apr 2012 15:02:15 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <image><link>http://shakaran.net/blog</link> <url>http://www.shakaran.net/blog/wp-content/favicon.png</url><title>Shakaran</title> </image> <item><title>Depurar y perfilar funciones PHP gráficamente con XDebug, KCacheGrind y Webgrind en Ubuntu 11.10</title><link>http://shakaran.net/blog/2012/01/depurar-y-perfilar-funciones-php-graficamente-con-xdebug-kcachegrind-y-webgrind-en-ubuntu-11-10/</link> <comments>http://shakaran.net/blog/2012/01/depurar-y-perfilar-funciones-php-graficamente-con-xdebug-kcachegrind-y-webgrind-en-ubuntu-11-10/#comments</comments> <pubDate>Wed, 18 Jan 2012 22:19:48 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Apache]]></category> <category><![CDATA[Open Source]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[software libre]]></category> <category><![CDATA[Ubuntu]]></category> <category><![CDATA[benchmark]]></category> <category><![CDATA[dbg]]></category> <category><![CDATA[debug]]></category> <category><![CDATA[debugger]]></category> <category><![CDATA[depurar]]></category> <category><![CDATA[design]]></category> <category><![CDATA[eficiencia]]></category> <category><![CDATA[ejecución]]></category> <category><![CDATA[escalabe]]></category> <category><![CDATA[github]]></category> <category><![CDATA[grafico]]></category> <category><![CDATA[grafo]]></category> <category><![CDATA[kcachegrind]]></category> <category><![CDATA[migracion]]></category> <category><![CDATA[nusphere]]></category> <category><![CDATA[path]]></category> <category><![CDATA[pear]]></category> <category><![CDATA[perfilar]]></category> <category><![CDATA[performance]]></category> <category><![CDATA[php5]]></category> <category><![CDATA[phped]]></category> <category><![CDATA[profiler]]></category> <category><![CDATA[profiling]]></category> <category><![CDATA[remote]]></category> <category><![CDATA[scalability]]></category> <category><![CDATA[stats]]></category> <category><![CDATA[tiempo]]></category> <category><![CDATA[webgrind]]></category> <category><![CDATA[xdebug]]></category> <category><![CDATA[zend]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=1143</guid> <description><![CDATA[En desarrollo web y por lo general, en cualquier aplicación que requiera tener una demanda escalable, son muy importantes los algoritmos empleados, las llamadas a funciones nativas y las estructuras de datos utilizadas. En aplicaciones PHP con miles de líneas de código se necesita un diseño eficiente para poder manejar una buena ejecución del código [...]<br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></description> <content:encoded><![CDATA[<div class="wpbuzzer_button" style="float: right"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="normal-button" data-url="http://shakaran.net/blog/2012/01/depurar-y-perfilar-funciones-php-graficamente-con-xdebug-kcachegrind-y-webgrind-en-ubuntu-11-10/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><div class="wp-caption aligncenter" style="width: 580px"><a href="http://shakaran.net/blog/wp-content/uploads/2012/01/the-art-of-debuggin-with-php.jpg"><img class=" wp-image-1145 " title="El arte de depurar y perfilar con PHP" src="http://shakaran.net/blog/wp-content/uploads/2012/01/the-art-of-debuggin-with-php.jpg" alt="El arte de depurar y perfilar con PHP" width="570" /></a><p class="wp-caption-text"><strong>El arte de depurar y perfilar con PHP</strong></p></div><p>En desarrollo web y por lo general, en cualquier aplicación que requiera tener una <strong>demanda escalable</strong>, son muy importantes los algoritmos empleados, las llamadas a funciones nativas y las estructuras de datos utilizadas.</p><p>En aplicaciones PHP con miles de líneas de código se necesita un <strong>diseño eficiente</strong> para poder manejar una buena ejecución del código PHP.</p><p>Principalmente se busca <strong>reducir el consumo</strong> de memoria y CPU al máximo posible, sin que la aplicación pierda funcionalidad, ni características. Para lograr este objetivo y que la aplicación sea <strong>escalable</strong>, se busca utilizar buenas herramientas de <strong>depuración y profiling</strong> (perfilado de rendimiento). Con ello se consigue que el programador o ingeniero disponga de una buena perspectiva de lo que esta haciendo a<strong> bajo nivel</strong> su aplicación y decidir en consecuencia que técnica aplicar.</p><p>El perfilado o medición del rendimiento (<em>performance profiling</em>) permite ejecutar código en un entorno controlado y devolver un listado con <strong>estadísticas</strong> de tiempo gastado en cada funcion, longitud de consultas a la base de datos o la cantidad de memoria que ha sido usada. De esta forma, se puede desechar codígo lento o superfluo de una manera muy rápida o incluso realizar pequeños trucos en partes críticas para ganar más rendimiento.</p><h3><span style="color: #993300;">Herramientas</span></h3><p>En PHP existen varias <strong>herramientas de depuración</strong>(debugging) y localización de <strong>cuellos de botella</strong>(bottleneck) para perfilado de rendimiento.</p><p>Las herramientas más utilizadas son:</p><ul><li><a title="BenchMark PEAR PHP project" href="http://pear.php.net/package/benchmark" target="_blank">BenchMark</a> es un proyecto PEAR de PHP, pero actualmente no esta mantenido.</li><li><a title="DBG PHP Debugger" href="http://www.php-debugger.com/dbg/" target="_blank">DBG PHP Debugger</a> es otra herramienta de depuración que dispone de una <strong>versión comercial</strong> y otra gratuita. La versión gratuita sólo permite depurar la rama de versión 5.2 y la comercial la versión 5.3. La aplicación es bastante cara y parece que no tiene mucha actividad y estar sólo integrada con el IDE <a title="NuSphere PhpED" href="http://www.nusphere.com/products/phped.htm" target="_blank">NuSphere PhpED</a>.</li><li>El <a title="Depurador avanzado de PHP - APD - Advanced PHP Debugger" href="http://es.php.net/manual/es/book.apd.php" target="_blank">Depurador Avanzado de PHP</a> (APD, del inglés &#8220;<em>Advanced PHP Debugger</em>&#8220;) es un proyecto PEAR de PHP escrito en C por George Schlossnagle and Daniel Cowgill. Es cargado como una <strong>extensión en el motor Zend</strong> y funciona enlazando e interceptando las llamadas a funciones en el núcleo de Zend. Esto permite la medición del tiempo de ejecución de una función, la vuelta atrás de pilas, etc. La documentación es mínima y los informes de depurado junto con funcionalidades son algo reducidas, por lo que en la práctica no es la opción más utilizada.</li><li><a title="Xdebug for debuggind and profiling" href="http://xdebug.org/" target="_blank">Xdebug</a> es el depurador y perfilador por excelencia de PHP escrito por <a href="http://www.derickrethans.nl/" rel="nofollow">Derick Rethans</a>. Tiene una gran variedad de <a title="XDebug listado de configuraciones" href="http://xdebug.org/docs/all_settings" target="_blank">parámetros de configuración</a>, depuración remota, <strong>integración</strong> con muchos IDEs (Eclipse, Netbeans, etc), reportes coloreados, niveles máximos de anidación para el depurado, accionadores (triggers) para el perfilador, un <a title="Functions on Xdebug" href="http://xdebug.org/docs/all_functions" target="_blank">conjunto de funciones</a> (para puntos de ruptura, analisis de tiempos, etiquetado de código, etc), reemplazo de var_dump por <a title="Display functions on Xdebug" href="http://xdebug.org/docs/display" target="_blank">funciones de visualización</a>, <a title="Stack trace on Xdebug" href="http://xdebug.org/docs/stack_trace" target="_blank">trazas de la pila de ejecución</a>,  <a title="Function traces on Xdebug" href="http://xdebug.org/docs/execution_trace" target="_blank">trazas de funciones</a>, <a title="Code coverage on Xdebug" href="http://xdebug.org/docs/code_coverage" target="_blank">análisis de cobertura de código</a>,   etc.</li></ul><h3><span style="color: #993300;">Instalación y configuración de Xdebug</span></h3><p>Puesto que Xdebug ofrece las mejores características y facilidades, es la <strong>opción preferida</strong>, ademas la instalación y configuración en Ubuntu 11.10 es bastante sencilla.</p><p>Se pueden <a title="Github de Xdebug" href="https://github.com/derickr/xdebug" target="_blank">bajar los f uentes</a> y compilarlos, pero resulta más cómodo bajar del repositorio PEAR la aplicación e instalarla.</p><p>Para instalar el <strong>paquete PEAR</strong>, debemos tener previamente PEAR instalado:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code29'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114329"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code29"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> php-pear php5-dev</pre></td></tr></table></div><p>Despues, instalamos Xdebug a través de PECL</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code30'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114330"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code30"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pecl <span style="color: #c20cb9; font-weight: bold;">install</span> xdebug</pre></td></tr></table></div><p>Una vez finalizada la instalación, podemos encontrar la <strong>biblioteca compartida</strong> compilada en <tt>/usr/lib/php5/20090626+lfs/xdebug.so</tt></p><p>Pasamos a configurar el <tt>php.ini</tt> para que cargue Xdebug. Por defecto Ubuntu 11.10 tiene varios <tt>php.ini</tt>, como son <tt>/etc/php5/cli/php.ini</tt> y <tt>/etc/php5/apache2/php.ini</tt>. Este último es que se utiliza para la <strong>configuración global</strong>.</p><p>Pasamos a modo root:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code31'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114331"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code31"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">su</span> -</pre></td></tr></table></div><p>Añadimos Xdebug al <tt>php.ini</tt> cargándolo como extensión zend y con el path completo, en nuestro caso el path es <tt>/usr/lib/php5/20090626+lfs/xdebug.so</tt></p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code32'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114332"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code32"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo 'zend_extension = &quot;/usr/lib/php5/20090626+lfs/xdebug.so&quot;' &gt;&gt; /etc/php5/apache2/php.ini</span></pre></td></tr></table></div><p>Después lo cargamos como <strong>extensión PHP</strong>:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code33'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114333"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code33"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;extension=xdebug.so&quot; &gt;&gt; /etc/php5/apache2/php.ini</span></pre></td></tr></table></div><p>Para comprobar que ha sido cargado, podemos mirar los <strong>módulos cargados</strong> de PHP:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code34'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114334"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1143code34"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># php -m | grep Xdebug</span>
Xdebug</pre></td></tr></table></div><p>O bien en la <strong>información general</strong>:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code35'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114335"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1143code35"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># php -i | grep Xdebug</span>
with Xdebug v2.1.2, Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>c<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2002</span>-<span style="color: #000000;">2011</span>, by Derick Rethans</pre></td></tr></table></div><p>Si filtramos en minúsculas para la información general, podemos ver todas las opción de configuración:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code36'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114336"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code" id="p1143code36"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># php -i | grep xdebug</span>
xdebug
xdebug support =<span style="color: #000000; font-weight: bold;">&gt;</span> enabled
xdebug.auto_trace =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.collect_assignments =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.collect_includes =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.collect_params =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">0</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">0</span>
xdebug.collect_return =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.collect_vars =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.default_enable =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.dump.COOKIE =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.ENV =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.FILES =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.GET =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.POST =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.REQUEST =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.SERVER =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump.SESSION =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.dump_globals =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.dump_once =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.dump_undefined =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.extended_info =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.file_link_format =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.idekey =<span style="color: #000000; font-weight: bold;">&gt;</span> root =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.manual_url =<span style="color: #000000; font-weight: bold;">&gt;</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.php.net =<span style="color: #000000; font-weight: bold;">&gt;</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.php.net
xdebug.max_nesting_level =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">100</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">100</span>
xdebug.overload_var_dump =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.profiler_aggregate =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.profiler_append =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.profiler_enable =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.profiler_enable_trigger =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.profiler_output_dir =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>tmp =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>tmp
xdebug.profiler_output_name =<span style="color: #000000; font-weight: bold;">&gt;</span> cachegrind.out.<span style="color: #000000; font-weight: bold;">%</span>t.<span style="color: #000000; font-weight: bold;">%</span>p =<span style="color: #000000; font-weight: bold;">&gt;</span> cachegrind.out.<span style="color: #000000; font-weight: bold;">%</span>t.<span style="color: #000000; font-weight: bold;">%</span>p
xdebug.remote_autostart =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.remote_connect_back =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.remote_cookie_expire_time =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">3600</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">3600</span>
xdebug.remote_enable =<span style="color: #000000; font-weight: bold;">&gt;</span> On =<span style="color: #000000; font-weight: bold;">&gt;</span> On
xdebug.remote_handler =<span style="color: #000000; font-weight: bold;">&gt;</span> dbgp =<span style="color: #000000; font-weight: bold;">&gt;</span> dbgp
xdebug.remote_host =<span style="color: #000000; font-weight: bold;">&gt;</span> 127.0.0.1 =<span style="color: #000000; font-weight: bold;">&gt;</span> 127.0.0.1
xdebug.remote_log =<span style="color: #000000; font-weight: bold;">&gt;</span> no value =<span style="color: #000000; font-weight: bold;">&gt;</span> no value
xdebug.remote_mode =<span style="color: #000000; font-weight: bold;">&gt;</span> req =<span style="color: #000000; font-weight: bold;">&gt;</span> req
xdebug.remote_port =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">9000</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">9000</span>
xdebug.scream =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.show_exception_trace =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.show_local_vars =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.show_mem_delta =<span style="color: #000000; font-weight: bold;">&gt;</span> Off =<span style="color: #000000; font-weight: bold;">&gt;</span> Off
xdebug.trace_format =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">0</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">0</span>
xdebug.trace_options =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">0</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">0</span>
xdebug.trace_output_dir =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp
xdebug.trace_output_name =<span style="color: #000000; font-weight: bold;">&gt;</span> trace.<span style="color: #000000; font-weight: bold;">%</span>c =<span style="color: #000000; font-weight: bold;">&gt;</span> trace.<span style="color: #000000; font-weight: bold;">%</span>c
xdebug.var_display_max_children =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">128</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">128</span>
xdebug.var_display_max_data =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">512</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">512</span>
xdebug.var_display_max_depth =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">3</span> =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000;">3</span></pre></td></tr></table></div><p><strong>Activando configuraciones en Xdebug</strong></p><p>Para generar información de depuración, debemos activar como mínimo las siguientes configuraciones de la familia <tt>xdebug.profiler_*</tt>:</p><ul><li>Primero escribimos la <strong>cabecera de configuración</strong>para xdebug:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code37'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114337"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code37"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;[xdebug]&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="Xdebug profiler_enable opción" href="http://xdebug.org/docs/all_settings#profiler_enable" target="_blank">xdebug.profiler_enable</a> activa el perfilador de xdebug para que genere archivos de perfilado en un <a title="Directorio de salida de Xdebug" href="http://xdebug.org/docs/all_settings#profiler_output_dir" target="_blank">directorio de salida</a>. Estos archivos puedes leerse por programas visualizadores gráficos de llamadas como <a title="KCacheGrind" href="http://kcachegrind.sourceforge.net/html/Home.html" target="_blank">KCacheGrind</a> o <a title="Webgrind" href="http://code.google.com/p/webgrind/" target="_blank">Webgrind</a>que será explicado más adelante. Esta configuración también puede habilitarse mediante la función ini_set() por lo que resulta interesante para activar selectivamente el perfilador en nuestras aplicaciones. Se activa con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code38'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114338"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code38"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.profiler_enable = 1&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="xdebug.profiler_enable_trigger en xdebug" href="http://xdebug.org/docs/all_settings#profiler_enable_trigger" target="_blank">xdebug.profiler_enable_trigger</a>permite generar archivos de perfilador usando el parámetro XDEBUG_PROFILE por peticiones GET/POST o establecer una cookie. Lo activamos con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code39'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114339"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code39"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.profiler_enable_trigger = 1&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="xdebug.profiler_output_dir en xdebug" href="http://xdebug.org/docs/all_settings#profiler_output_dir" target="_blank">xdebug.profiler_output_dir</a> el valor por defecto donde el perfilador escribira su salida. Debe tener permisos de escritura para PHP y no puede ser establecida con ini_set(). Para propósitos posteriores, la estableceremos como:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code40'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114340"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code40"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo 'xdebug.profiler_output_dir = &quot;/var/www/webgrind/tmp&quot;' &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="http://xdebug.org/docs/all_settings#profiler_output_name" href="http://xdebug.org/docs/all_settings#profiler_output_name" target="_blank">xdebug.profiler_output_name</a> determina el nombre del archivo usado para las trazas de depuración. La configuración especifica el formato del nombre con los especificares de formato que son muy similares a sprintf() y strtime(). Por defecto es cachegrind.out.%p. Existe un un <a title="Listado de especificadores para archivos de nombre de depuración de Xdebug" href="http://xdebug.org/docs/all_settings#trace_output_name" target="_blank">listado completo de los especificadores</a>documentados. Lo configuramos con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code41'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114341"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code41"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.profiler_output_name = cachegrind.out.%t.%p&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li></ul><p>La configuración mínima recomendada que resultaría al final del <tt>php.ini</tt> quedaría como:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code42'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114342"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1143code42"><pre class="bash" style="font-family:monospace;">zend_extension = <span style="color: #ff0000;">&quot;/usr/lib/php5/20090626+lfs/xdebug.so
extension=xdebug.so
&nbsp;
[xdebug]
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = &quot;</span><span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #ff0000;">&quot;
xdebug.profiler_output_name = cachegrind.out.%t.%p</span></pre></td></tr></table></div><p>Si queremos activar ademas la depuración remota en un puerto y máquina (o bien en la misma), usaremos la familia de configuraciones <tt>xdebug.remote_*</tt>. Las mínimas recomendadas son:</p><ul><li><a title="xdebug.remote_enable config option" href="http://xdebug.org/docs/all_settings#remote_enable" target="_blank">xdebug.remote_enable</a> si esta activado, Xdebug tratará de contactar con el cliente que este escuchando en el puerto y host configurad. Si la conexión no puede ser establecidad, el script continuará ejecutado como si estuviera desactivado. Lo activamos con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code43'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114343"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code43"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.&lt;a title=&quot;xdebug.remote_enable config option&quot; href=&quot;http://xdebug.org/docs/all_settings#remote_enable&quot; target=&quot;_blank&quot;&gt;remote_enable&lt;/a&gt; = 1&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="xdebug.remote_host config option" href="http://xdebug.org/docs/all_settings#remote_host" target="_blank">xdebug.remote_host</a> selecciona el host donde el cliente de depuración se ejecutará. Puede utilizar un nombre de host o una dirección IP. Lo configuramos con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code44'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114344"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code44"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.remote_host=127.0.0.1&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="xdebug.remote_port config option" href="http://xdebug.org/docs/all_settings#remote_port" target="_blank">xdebug.remote_port</a> el puerto al que Xdebug tratara de conectar en el host remoto. Por defecto es el puerto 9000, para el cliente y cliente de debug integrado. Lo configuramos con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code45'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114345"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code45"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.remote_port=9000&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li><li><a title="xdebug.remote_handler config option" href="http://xdebug.org/docs/all_settings#remote_handler" target="_blank">xdebug.remote_handler</a> puede ser &#8216;php3&#8242; que selecciona el <a title="Depurador antiguo para PHP3" href="http://www.php.net/manual/en/debugger.php" target="_blank">depurador antiguo para PHP3</a>, tambiíen puede ser &#8217;gdb&#8217; que habilita el depurador GDB o bien el protocolo de depuración con &#8216;dbgp&#8217;. El <a title="Protocolo de depuración de Xdebug" href="http://xdebug.org/docs-dbgp.php" target="_blank">protocolo de depuración</a>esta por lo general más soportado por los clientes. Lo configuramos con:<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code46'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114346"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code46"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;xdebug.remote_handler=dbgp&quot; &gt;&gt; /etc/php5/cli/php.ini</span></pre></td></tr></table></div></li></ul><p>Puedes ver más información en la <a title="Introducción al depurado remoto con Xdebug" href="http://xdebug.org/docs/remote" target="_blank">introducción al depurado remoto</a> de Xdebug.</p><p>Por lo que el resultado final sería:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code47'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114347"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1143code47"><pre class="bash" style="font-family:monospace;">zend_extension = <span style="color: #ff0000;">&quot;/usr/lib/php5/20090626+lfs/xdebug.so
extension=xdebug.so
&nbsp;
[xdebug]
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = &quot;</span><span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #ff0000;">&quot;
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.remote_enable=true
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp</span></pre></td></tr></table></div><h3><span style="color: #993300;">Instalando KCacheGrind</span></h3><p><a title="KCacheGrind - Página de inicio" href="http://kcachegrind.sourceforge.net/html/Home.html" target="_blank">KCacheGrind</a> es un programa de escritorio (en especial para diseñado para KDE, pero compatible para GNOME) escrito para <strong>visualizar los archivos de depuración</strong> generados por xdebug. Es un frontend de <a title="Manual de Callgrind" href="http://valgrind.org/docs/manual/cl-manual.html" target="_blank">Callgrind</a>, que a su vez usa en tiempo de ejecución al framework de <a title="Valgrind profiler" href="http://kcachegrind.sourceforge.net/html/Valgrind.html" target="_blank">Valgrind</a> para <strong>simulación de caches</strong> y generación de las llamadas gráficas. Un aspecto a recalcar es que incluso las bibliotecas compartidas que son abiertas dinamicamente son perfiladas. Podemos abrir con el archivos de depuración con <a title="Formato Callgrind - Archivos de depuración" href="http://kcachegrind.sourceforge.net/html/CallgrindFormat.html" target="_blank">formato Callgrind</a> generados con xdebug de forma bastante rápida.</p><p>Para instalarlo simplemente:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code48'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114348"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code48"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> kcachegrind</pre></td></tr></table></div><p>Por ejemplo podemos crear un archivo con la información de PHP para ver un <strong>ejemplo sencillo</strong> de depuración y ejecutarlo para que se genere un archivo cachegrind.out, que podamos abrir con KCacheGrind:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code49'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114349"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code49"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># echo &quot;&amp;lt;?php phpinfo(); ?&gt;&quot; &gt;&gt; /var/www/phpinfo.php</span></pre></td></tr></table></div><p>Como resultado, obtendríamos un grafo y los<strong> tiempos de ejecución</strong> globales y relativos implicados:</p><div class="mceTemp mceIEcenter"><dl id="attachment_1144" class="wp-caption aligncenter" style="width: 570px;"><dt class="wp-caption-dt"><a href="http://shakaran.net/blog/wp-content/uploads/2012/01/kcachegrind.png"><img class=" wp-image-1144 " title="KCacheGrind - Ejemplo sencillo con phpinfo()" src="http://shakaran.net/blog/wp-content/uploads/2012/01/kcachegrind.png" alt="KCacheGrind - Ejemplo sencillo con phpinfo()" width="570" /></a>Ejemplo de depuración de phpinfo() con KCacheGrind</dt></dl></div><p>Es una aplicación<strong> bastante notabl</strong>e, pero en su lugar es más recomendable usar Webgrind como frontend web, que veremos a continuación.</p><h3><span style="color: #993300;">Instalar webgrind</span></h3><div class="mceTemp mceIEcenter"><dl id="attachment_1158" class="wp-caption aligncenter" style="margin:auto;width: 162px;"><dt class="wp-caption-dt"><a href="http://shakaran.net/blog/wp-content/uploads/2012/01/webgrind_logo.png"><img class="size-full wp-image-1158" title="Webgrind 1.0 logo" src="http://shakaran.net/blog/wp-content/uploads/2012/01/webgrind_logo.png" alt="Webgrind 1.0 logo" width="152" height="60" /></a></dt></dl></div><p>Webgrind es un perfilador gráfico de PHP via web escrito en PHP por <a href="http://jokke.dk/" rel="nofollow">Joakim Nygård</a> y <a href="http://oettinger.dk/" rel="nofollow">Jacob Oettinger</a>. Tiene como dependencia Xdebug ya que es en realidad un wrapper web no completo de las funciones de KCacheGrind como reemplazo de <a title="Xdebug profiling web frontend" href="https://wiki.php.net/gsoc/2008#xdebug_profiling_web_frontend" target="_blank">frontend web de xdebug</a> (existe incluso una proposición de Google Summer of Code <a title="Google Summer of code xdebug web frontend" href="http://code.google.com/soc/2008/php/appinfo.html?csaid=F74E5E31D92F95D0" target="_blank">aceptada por Chung-Yang Lee</a>).</p><p>Su apareciencia es simple y agradable para <strong>depurar aplicaciones</strong> PHP. Es multiplataforma (al ser vía web) y permite seguimiento de los tiempos empleados por cada llamada de función, por coste de ellas misma o <strong>coste inclusivo</strong> (el coste inclusivo es el tiempo dentro de la función mas llamadas internas de esa función a otras).</p><p>También permite ver tiempo de <strong>llamadas internas</strong> y llamadas de usuario diciendo la llamada por la que fue invocada previamente.</p><p>Descargamos la aplicación de github, ya que en el momento de escribir este artículo están haciendo una <strong>migración de google code</strong> a github (también puedes hacer un checkout del repo, aunque puede ser inestable):</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code50'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114350"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code50"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">wget</span> https:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>downloads<span style="color: #000000; font-weight: bold;">/</span>jokkedk<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>webgrind-release-<span style="color: #000000;">1.0</span>.zip</pre></td></tr></table></div><p>Descomprimos:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code51'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114351"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code51"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">unzip</span> webgrind-release-<span style="color: #000000;">1.0</span>.zip</pre></td></tr></table></div><p>En ubuntu el <em>DocumentRoot</em> de Apache esta establecido <strong>por defecto</strong> en <em>/var/www</em> según <em>/etc/apache2/sites-available/default</em></p><p>Luego, copiaremos los fuentes de webgrind y crearemos los <strong>archivos temporales</strong> que configuramos como directorio de salida en el perfilador de Xdebug:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code52'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114352"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1143code52"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mv</span> webgrind <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>tmp
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">777</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>tmp</pre></td></tr></table></div><p>Editamos el <strong>archivo de configuración</strong> e introducimos la ruta de directorio de salida de xdebug:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code53'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114353"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code53"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span>config.php</pre></td></tr></table></div><p>Busca las variables $storageDir y $profilerDir y escribe:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code54'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114354"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1143code54"><pre class="bash" style="font-family:monospace;">static <span style="color: #007800;">$storageDir</span> = <span style="color: #ff0000;">'/var/www/webgrind/tmp'</span>;
static <span style="color: #007800;">$profilerDir</span> = <span style="color: #ff0000;">'/var/www/webgrind/tmp'</span>;</pre></td></tr></table></div><p>Nos aseguramos de todos los archivos tienen los <strong>permisos de grupo</strong> correctos de Apache:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code55'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114355"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code55"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> www-data.www-data <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>webgrind<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div><p>Si además queremos que no se creen archivos de depuración para el propio webgrind, creamos un <strong>archivo .htaccess</strong> en el directorio de webgrind desactivandolo:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1143code56'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114356"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code56"><pre class="bash" style="font-family:monospace;">php_flag xdebug.profiler_enable <span style="color: #000000;">0</span></pre></td></tr></table></div><p>Para entrar a la interfaz web de Webgrind, simplemente escribe en tu navegador <a href="http://localhost/webgrind/" title="Webgrind">http://localhost/webgrind/</a> y aparecerá disponible un <strong>listado de archivos</strong> cachegrind* donde podemos ver la traza y tiempos de depuración del perfilador:</p><div class="mceTemp mceIEcenter"><dl id="attachment_1159" class="wp-caption aligncenter" style="width: 580px;"><dt class="wp-caption-dt"><a href="http://shakaran.net/blog/wp-content/uploads/2012/01/webgrind_trace.png"><img class=" wp-image-1159 " title="Traza de depuración de phpinfo() con Webgrind" src="http://shakaran.net/blog/wp-content/uploads/2012/01/webgrind_trace-1024x231.png" alt="Traza de depuración de phpinfo() con Webgrind" width="570" /></a><strong>Traza de depuración de phpinfo() con Webgrind</strong></dt></dl></div> <br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></content:encoded> <wfw:commentRss>http://shakaran.net/blog/2012/01/depurar-y-perfilar-funciones-php-graficamente-con-xdebug-kcachegrind-y-webgrind-en-ubuntu-11-10/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Instalar uploadprogress 1.0.1 de Pecl en PHP 5.3 con Centos</title><link>http://shakaran.net/blog/2010/09/instalar-uploadprogress-1-0-1-de-pecl-en-php-5-3-con-centos/</link> <comments>http://shakaran.net/blog/2010/09/instalar-uploadprogress-1-0-1-de-pecl-en-php-5-3-con-centos/#comments</comments> <pubDate>Mon, 06 Sep 2010 08:15:55 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Centos]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Servidores]]></category> <category><![CDATA[centos]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[install]]></category> <category><![CDATA[php 5.3]]></category> <category><![CDATA[php.ini]]></category> <category><![CDATA[progress]]></category> <category><![CDATA[repositorios]]></category> <category><![CDATA[upload]]></category> <category><![CDATA[uploadprogress]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=1000</guid> <description><![CDATA[Uploadprogress es un paquete del repositorio Pecl de PHP que sirve para realizar un seguimiento de progresos de la subida de un archivo. Instalarlo sobre PHP 5.3 en una distribución Centos 5.5 es una tarea tan sencilla como indicar el siguiente comando: ?Ver código BASH1 # pecl install uploadprogress Después reinicia Apache con: ?Ver código [...]<br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></description> <content:encoded><![CDATA[<div class="wpbuzzer_button" style="float: right"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="normal-button" data-url="http://shakaran.net/blog/2010/09/instalar-uploadprogress-1-0-1-de-pecl-en-php-5-3-con-centos/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><p><a title="Uploadprogress de PHP" href="http://pecl.php.net/package/uploadprogress/" target="_blank">Uploadprogress</a> es un paquete del repositorio <a title="Repositorio PECL de PHP" href="http://pecl.php.net/" target="_blank">Pecl</a> de PHP que sirve para realizar un <strong>seguimiento de progresos de la subida</strong> de un archivo.</p><p>Instalarlo sobre PHP 5.3 en una distribución Centos 5.5 es una tarea tan sencilla como indicar el siguiente comando:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1000code60'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p100060"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1000code60"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># pecl install uploadprogress</span></pre></td></tr></table></div><p>Después reinicia Apache con:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1000code61'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p100061"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1000code61"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># service httpd restart</span></pre></td></tr></table></div><p>Obviamente para ello <strong>requiere tener PECL</strong> instalado. Otra forma de instalación es mediante la descarga de fuentes y su compilación, aunque de esta forma es mucho más rápido.</p><p>Puedes comprobar si la extensión ha sido correctamente instalada, mirando en el archivo php.ini:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1000code62'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p100062"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1000code62"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># cat /usr/local/lib/php.ini | grep uploadprogress</span>
<span style="color: #007800;">extension</span>=<span style="color: #ff0000;">&quot;uploadprogress.so&quot;</span></pre></td></tr></table></div><ul><li>Pagina web de UploadProgress en el repositorio PECL:</li></ul><p><a title="Pagina web de UploadProgress en el repositorio PECL" href="http://pecl.php.net/package/uploadprogress/" target="_blank">http://pecl.php.net/package/uploadprogress/</a></p> <br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></content:encoded> <wfw:commentRss>http://shakaran.net/blog/2010/09/instalar-uploadprogress-1-0-1-de-pecl-en-php-5-3-con-centos/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Solucionar error pdo_sqlite.so: undefined symbol: sqlite3_libversion</title><link>http://shakaran.net/blog/2010/08/solucionar-error-pdo_sqlite-so-undefined-symbol-sqlite3_libversion-2/</link> <comments>http://shakaran.net/blog/2010/08/solucionar-error-pdo_sqlite-so-undefined-symbol-sqlite3_libversion-2/#comments</comments> <pubDate>Thu, 05 Aug 2010 07:51:44 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Cpanel]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Servidores]]></category> <category><![CDATA[centos]]></category> <category><![CDATA[deactivar]]></category> <category><![CDATA[dynamic]]></category> <category><![CDATA[error]]></category> <category><![CDATA[extensions]]></category> <category><![CDATA[library]]></category> <category><![CDATA[mensajes]]></category> <category><![CDATA[no-debug]]></category> <category><![CDATA[pdo_sqlite.so]]></category> <category><![CDATA[solucionar]]></category> <category><![CDATA[sqlite3]]></category> <category><![CDATA[sqlite3_version]]></category> <category><![CDATA[symbol]]></category> <category><![CDATA[undefined]]></category> <category><![CDATA[warning]]></category> <category><![CDATA[zts]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=984</guid> <description><![CDATA[Si utilizas Cpanel y Centos 5.5 o cualquier sistema similar donde encuentres este error en tus error_log de apache: ?Ver código SHELL1 2 [04-Aug-2010 10:32:08] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20090626/pdo_sqlite.so' - /usr/local/lib/php/extensions/no-debug-non-zts-20090626/pdo_sqlite.so: undefined symbol: sqlite3_libversion in Unknown on line 0 Puedes llegar a saturarte el disco de mensajes de error [...]<br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></description> <content:encoded><![CDATA[<div class="wpbuzzer_button" style="float: right"><a title="Post on Google Buzz" class="google-buzz-button" href="http://www.google.com/buzz/post" data-button-style="normal-button" data-url="http://shakaran.net/blog/2010/08/solucionar-error-pdo_sqlite-so-undefined-symbol-sqlite3_libversion-2/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><p>Si utilizas Cpanel y Centos 5.5 o cualquier sistema similar donde encuentres este error en tus error_log de apache:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p984code65'); return false;">Ver código</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p98465"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p984code65"><pre class="shell" style="font-family:monospace;">[04-Aug-2010 10:32:08] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/extensions/no-debug-non-zts-20090626/pdo_sqlite.so'
- /usr/local/lib/php/extensions/no-debug-non-zts-20090626/pdo_sqlite.so: undefined symbol: sqlite3_libversion in Unknown on line 0</pre></td></tr></table></div><p>Puedes llegar a <strong>saturarte el disco de mensajes</strong> de error y para evitar dicho error y solucionar el problema, simplemente debes desactivar la extensión pdo_sqlite.so de tu php.ini global y puedes hacerlo fácilmente con el siguiente comando:</p><div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p984code66'); return false;">Ver código</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p98466"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p984code66"><pre class="shell" style="font-family:monospace;">sudo sed -i 's/extension=pdo_sqlite.so/;extension=pdo_sqlite.so/g' /usr/local/lib/php.ini</pre></td></tr></table></div><p>Esta es una solución para <strong>evitar el problema</strong>, pero la solución buena sería conseguir detectar el error que lo produce y solucionar para que no se tenga que desactivar dicha extensión.</p><p>Si conoces como solucionarlo bien, me encantaría leerlo en los comentarios.</p> <br /><div><img src="http://shakaran.net/blog/wp-content/plugins/gd-star-rating/gfx.php?value=0.0" /></div><div>Rating: 0.0/<strong>10</strong> (0 votes cast)</div><br />]]></content:encoded> <wfw:commentRss>http://shakaran.net/blog/2010/08/solucionar-error-pdo_sqlite-so-undefined-symbol-sqlite3_libversion-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached
Database Caching 1/78 queries in 0.043 seconds using memcached
Object Caching 2192/2411 objects using memcached

Served from: shakaran.net @ 2012-05-23 16:47:52 -->
