<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Shakaran</title> <link>http://shakaran.net/blog</link> <description>Blog de un estudiante de ingeniería informática y sysadmin</description> <lastBuildDate>Fri, 20 Jan 2012 01:04:24 +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> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Shakaran" /><feedburner:info uri="shakaran" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Shakaran</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Depurar y perfilar funciones PHP gráficamente con XDebug, KCacheGrind y Webgrind en Ubuntu 11.10</title><link>http://feedproxy.google.com/~r/Shakaran/~3/uK6tdVhJ6bA/</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>0</slash:comments> <feedburner:origLink>http://shakaran.net/blog/2012/01/depurar-y-perfilar-funciones-php-graficamente-con-xdebug-kcachegrind-y-webgrind-en-ubuntu-11-10/</feedburner:origLink></item> <item><title>Automatizar actualizaciones con yum-updatesd y yum-cron en CentOS</title><link>http://feedproxy.google.com/~r/Shakaran/~3/itkPTt0-ZAU/</link> <comments>http://shakaran.net/blog/2011/12/automatizar-actualizaciones-con-yum-updatesd-y-yum-cron-en-centos/#comments</comments> <pubDate>Fri, 23 Dec 2011 19:25:14 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Centos]]></category> <category><![CDATA[Open Source]]></category> <category><![CDATA[Servidores]]></category> <category><![CDATA[software libre]]></category> <category><![CDATA[Tecnología]]></category> <category><![CDATA[actualizacion]]></category> <category><![CDATA[automatico]]></category> <category><![CDATA[centos]]></category> <category><![CDATA[configurable]]></category> <category><![CDATA[cron]]></category> <category><![CDATA[daemon]]></category> <category><![CDATA[dbus]]></category> <category><![CDATA[debug]]></category> <category><![CDATA[distribución]]></category> <category><![CDATA[email]]></category> <category><![CDATA[global]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[notificacion]]></category> <category><![CDATA[syslog]]></category> <category><![CDATA[updates]]></category> <category><![CDATA[yum]]></category> <category><![CDATA[yum-updatesd]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=1120</guid> <description><![CDATA[CentOS es una distribución de las consideradas como más estables. Aunque sea bastante estable, no implica que no necesite de actualizaciones con regularidad debido a incidencias críticas en algún paquete de software o bien debido avulnerabilidades. Para evitar consumir tiempo a los administradores de sistemas comprobando regularmente si se necesita alguna actualización, existen herramientas que [...]<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/2011/12/automatizar-actualizaciones-con-yum-updatesd-y-yum-cron-en-centos/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><div class="mceTemp mceIEcenter" style="margin:auto"><dl id="attachment_1128" class="wp-caption aligncenter" style="margin:auto;width: 310px;"><dt class="wp-caption-dt"><a href="http://shakaran.net/blog/wp-content/uploads/2011/12/updates.jpg"><img class="size-full wp-image-1128" title="Actualizaciones automáticas" src="http://shakaran.net/blog/wp-content/uploads/2011/12/updates.jpg" alt="Actualizaciones automáticas" width="300" height="300" /></a></dt></dl></div><p><a title="Distribución GNU/Linux CentOS" href="http://centos.org/">CentOS</a> es una distribución de las consideradas como más estables. Aunque sea <strong>bastante estable</strong>, no implica que no necesite de actualizaciones con regularidad debido a incidencias críticas en algún paquete de software o bien debido avulnerabilidades.</p><p>Para evitar consumir tiempo a los administradores de sistemas comprobando regularmente si se necesita <strong>alguna actualización</strong>, existen herramientas que se encargan de realizar esta tarea de forma períodica.</p><p>Existen dos alternativas en CentOS:</p><ul><li><strong>yum-updatesd</strong> es un demonio notificador de actualizaciones que puedan ser aplicadas al sistema</li><li><strong>yum-cron</strong> es un paquete con los archivos necesarios para hacer que el comando <em>yum update</em> se establezca como un trabajo de cron.</li></ul><p>Generalmente yum-updatesd es <strong>más recomendable</strong> para escritorios y yum-cron para servidores, por este motivo coexisten ambos.</p><p>yum-cron es algo más sencillo pero no dispone de muchas opciones de configuración, aunque yum-updatesd es más configurable, pero parece tener algunas fugas y acumulaciones de memoria/CPU cuando se ejecuta durante bastante tiempo en servidores.</p><h3><span style="color: #993300;">Configurando yum-updatesd</span></h3><p>Podemos instalarlo 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('p1120code65'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112065"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1120code65"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># yum install yum-updatesd</span></pre></td></tr></table></div><p>yum-updatesd dispone de varios <strong>métodos de notificación</strong>:</p><ul><li>syslog</li></ul><ul><li>email</li></ul><ul><li>dbus</li></ul><p>Estas notificaciones se configuran mediante el archivo de configuración <em>/etc/yum/yum-updatesd.conf</em>. Este archivo dispone de <strong>una única sección</strong> &#8220;main&#8221; que define todas las opciones de configuración globales. Las opciones disponibles son las siguientes:</p><ul><li><strong>run_interval </strong>Número de segundos a esperar entre comprobaciones de actualizaciones disponibles.</li></ul><ul><li><strong>updaterefresh </strong>Número mínimo de segundos entre para actualizar la información de actualizaciones para evitar acceder al servidor con demasiada frecuencia.</li></ul><ul><li><strong>emit_via </strong>Lista de maneras para emitir una notificación de actualización. Los valores válidos son: &#8216;email&#8217;, &#8216;dbus&#8217; y &#8216;syslog&#8217;.</li></ul><ul><li><strong>do_update </strong>Opción booleana para decidir si las actualizaciones deberían ser o no aplicadas. Por defecto falso.</li></ul><ul><li><strong>do_download </strong>Opción booleana para decidir si las actualizaciones deberían o no ser descargadas automáticamente. Por defecto falso.</li></ul><ul><li><strong>do_download_deps </strong>Opción booleana para automáticamente descargar las dependencias de paquetes que necesitan actualizarse también. Por defecto falso.</li></ul><h4><span style="color: #993300;">Opciones de notificacion por email</span></h4><ul><li><strong>email_to </strong>Lista de direcciones email para enviar las actualizaciones de notificación. Por defecto &#8216;root&#64;locahost&#8217;.<strong></strong></li></ul><ul><li><strong>email_from </strong>Direcciones de email desde donde enviar las notificaciones de actualización. Por defecto &#8216;yum-updatesd&#64;localhost&#8217;.</li></ul><ul><li><strong>smtp_server </strong>Servidor SMTP para usar en el envío de email, cadena de host o host:puerto. Por defecto &#8216;localhost:25&#8242;.</li></ul><h4><span style="color: #993300;">Opciones de notificacion por Syslog</span></h4><ul><li><strong>syslog_facility </strong>La instalación de syslog que debería ser usada. Por defecto &#8216;DAEMON&#8217;.be used. Defaults to &#8216;DAEMON&#8217;.</li></ul><ul><li><strong>syslog_level </strong>Nivel de los mensajes en syslog. Por defecto &#8216;WARN&#8217;.</li></ul><h3><span style="color: #993300;">Ejemplo de configuración</span></h3><p>Un ejemplo de configuración posible para <tt>/etc/yum/yum-updatesd.conf</tt> donde <strong>cada 8 horas</strong> comprobamos actualizaciones sin instalarlas, pero descargandolas y notificamos si existe alguna por email puede ser:</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('p1120code66'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112066"><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
</pre></td><td class="code" id="p1120code66"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>main<span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #666666; font-style: italic;"># how often to check for new updates (in seconds)</span>
run_interval = <span style="color: #000000;">28800</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># how often to allow checking on request (in seconds)</span>
updaterefresh = <span style="color: #000000;">3600</span>
<span style="color: #666666; font-style: italic;"># how to send notifications (valid: dbus, email, syslog)</span>
emit_via = email
<span style="color: #666666; font-style: italic;"># should we listen via dbus to give out update information/check for</span>
<span style="color: #666666; font-style: italic;"># new updates</span>
dbus_listener = <span style="color: #c20cb9; font-weight: bold;">yes</span>
<span style="color: #666666; font-style: italic;"># who to send the email notifications to</span>
email_to = tuemail<span style="color: #000000; font-weight: bold;">@</span>tudominio.com
<span style="color: #666666; font-style: italic;"># who send the notifications</span>
email_from = yumupdates<span style="color: #000000; font-weight: bold;">@</span>tudominio.com
<span style="color: #666666; font-style: italic;"># automatically install updates</span>
do_update = no
<span style="color: #666666; font-style: italic;"># automatically download updates</span>
do_download = <span style="color: #c20cb9; font-weight: bold;">yes</span>
<span style="color: #666666; font-style: italic;"># automatically download deps of updates</span>
do_download_deps = <span style="color: #c20cb9; font-weight: bold;">yes</span></pre></td></tr></table></div><p>Después de configurar el servicio, lo iniciaremos 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('p1120code67'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112067"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1120code67"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># service yum-updatesd start</span></pre></td></tr></table></div><p>Y para que se inicie en cada inicio del servidor:</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('p1120code68'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112068"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1120code68"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># chkconfig yum-updatesd on</span></pre></td></tr></table></div><p>Para desactivar es realizar la operación inversa a yum-updatesd:</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('p1120code69'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112069"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1120code69"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#service yum-updatesd stop</span>
<span style="color: #666666; font-style: italic;">#chkconfig --del yum-updatesd</span></pre></td></tr></table></div><p><em><strong>Nota:</strong></em> Recuerda que una vez desactivado no se notificará ningún tipo de actualización, y debe por tanto realizarse de forma manual.</p><h3><span style="color: #993300;">Configurando yum-cron</span></h3><div><div>yum-cron se habilita como si fuera cualquier otro daemon:</div><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('p1120code70'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112070"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1120code70"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># yum install yum-cron</span>
<span style="color: #666666; font-style: italic;"># yum chkconfig yum-cron on</span>
<span style="color: #666666; font-style: italic;"># service yum-cron start</span></pre></td></tr></table></div><p>Esto creara un archivo <tt>/etc/cron.daily/0yum.cron</tt> que será ejecutado diariamente a la hora programada.</p></div><p>Aunque se trata como daemon, en realidad no lo es, sino que es un script que se ejecuta diariamente y limpia las actualizaciones semanalmente. Es fácil comprobar con <strong>chkconfig –list</strong> que yum-cron esta en la lista, pero desahabilitado para todos los niveles de ejecución. Puede activarse si se desea 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('p1120code71'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112071"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1120code71"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># chkconfig yum-cron on</span></pre></td></tr></table></div><div>Este paso <strong>no es necesario</strong> ya que cron ejecutara igualmente la tarea programada.</div><div></div><div>Si es necesario iniciar por primera vez yum-cron para que se cree el archivo en cron-daily con un flag en /var/lock/subsys/yum-cron:</div><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('p1120code72'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p112072"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1120code72"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/init.d/yum.cron start</span></pre></td></tr></table></div><p><em><strong>Nota:</strong></em> Es importante recalcar que algunos paquetes como los del kernel requieren de reinicio para aplicar las nuevas actualizaciones y yum-updatesd y yum-cron no implican reiniciar el sistema, por lo que recae esta ultima atencion al administrador del sistema.</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/2011/12/automatizar-actualizaciones-con-yum-updatesd-y-yum-cron-en-centos/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://shakaran.net/blog/2011/12/automatizar-actualizaciones-con-yum-updatesd-y-yum-cron-en-centos/</feedburner:origLink></item> <item><title>Solucionar “stdin: is not a tty”</title><link>http://feedproxy.google.com/~r/Shakaran/~3/bEwb-TZm6Ho/</link> <comments>http://shakaran.net/blog/2011/12/solucionar-stdin-is-not-a-tty/#comments</comments> <pubDate>Sat, 17 Dec 2011 17:25:54 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Open Source]]></category> <category><![CDATA[Servidores]]></category> <category><![CDATA[software libre]]></category> <category><![CDATA[bash]]></category> <category><![CDATA[bashrc]]></category> <category><![CDATA[interativa]]></category> <category><![CDATA[scp]]></category> <category><![CDATA[sesion]]></category> <category><![CDATA[ssh]]></category> <category><![CDATA[stdin]]></category> <category><![CDATA[tty]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=1109</guid> <description><![CDATA[&#160; Normalmente se puede encontrar este aviso/error usando scp o sobre otras aplicaciones que utilicen sesiones ssh no interactivas en algún servidor o estación de trabajo. No suele perjudicar el rendimiento de la aplicación o implicar algún mal funcionamiento, pero puede resultar molesto o generar dudas de si todo esta funcionando correctamente. El problema se [...]<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/2011/12/solucionar-stdin-is-not-a-tty/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><p>&nbsp;</p><div id="attachment_1110" class="wp-caption aligncenter" style="width: 291px"><a href="http://shakaran.net/blog/wp-content/uploads/2011/12/TTY.gif"><img class=" wp-image-1110" title="TTY" src="http://shakaran.net/blog/wp-content/uploads/2011/12/TTY.gif" alt="TTY" width="281" height="281" /></a><p class="wp-caption-text">TTY</p></div><p>Normalmente se puede encontrar este aviso/error usando <a title="Secure Copy Wikipedia" href="http://en.wikipedia.org/wiki/Secure_copy">scp</a> o sobre otras aplicaciones que utilicen sesiones <a title="Secure Shell - SSH Wikipedia" href="http://en.wikipedia.org/wiki/Secure_shell">ssh</a> <strong>no interactivas</strong> en algún servidor o estación de trabajo.</p><p>No suele perjudicar el rendimiento de la aplicación o implicar algún mal funcionamiento, pero puede<strong> resultar molesto</strong> o generar dudas de si todo esta funcionando correctamente.</p><p>El problema se origina cuando por ejemplo scp se ejecuta leyendo el archivo de bash <tt>~/.bashrc</tt> y este invoca al bashrc global en <tt>/etc/bashrc</tt>. El <strong>archivo global</strong> de bashrc tiene comandos que sólo son aplicables si la sesión es interactiva y puesto que scp se ejecuta sobre una sesión no interactiva esos comandos no se ejecutaran apropiadamente, provocando el error mencionado.</p><p>Para solucionarlo, se puede optar por <strong>detectar</strong> si la sesión es interactiva y no cargar dichos ficheros. Para ello se debe editar justo <strong>al principio</strong> del archivo <tt>~/.bashrc</tt> y añadir las siguientes líneas:</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('p1109code74'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p110974"><td class="code" id="p1109code74"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">expr</span> index <span style="color: #ff0000;">&quot;$-&quot;</span> i<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">return</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></table></div><p>Estas línea detectan si se trata de una sesión interactiva que contenga &#8220;i&#8221; $-, y parara de procesar el <tt>.bashrc</tt> (antes de que el bashrc global se invoque) y <strong>no se generen errores</strong>.</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/2011/12/solucionar-stdin-is-not-a-tty/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://shakaran.net/blog/2011/12/solucionar-stdin-is-not-a-tty/</feedburner:origLink></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 8/49 queries in 0.172 seconds using memcached
Object Caching 2463/2565 objects using memcached

Served from: shakaran.net @ 2012-02-04 04:46:39 -->

