<?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>Thu, 09 Feb 2012 11:49: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> <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>Acelerar la carga del terminal borrando logs en Ubuntu</title><link>http://feedproxy.google.com/~r/Shakaran/~3/t0JuD5H0vOI/</link> <comments>http://shakaran.net/blog/2012/02/acelerar-la-carga-del-terminal-borrando-logs-en-ubuntu/#comments</comments> <pubDate>Thu, 09 Feb 2012 11:49:15 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[Centos]]></category> <category><![CDATA[Open Source]]></category> <category><![CDATA[software libre]]></category> <category><![CDATA[alias]]></category> <category><![CDATA[borrado]]></category> <category><![CDATA[config]]></category> <category><![CDATA[cron]]></category> <category><![CDATA[logrotate]]></category> <category><![CDATA[logs]]></category> <category><![CDATA[puppet]]></category> <category><![CDATA[repetitivo]]></category> <category><![CDATA[tarea]]></category> <category><![CDATA[terminal]]></category> <category><![CDATA[volumen]]></category> <category><![CDATA[zerolog]]></category> <category><![CDATA[zlog]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=1189</guid> <description><![CDATA[Por lo general, al iniciar alguna consola o terminal bash, se leen muchos archivos de configuración por defecto y se abren archivos para guardar los eventos de actividad que van ocurriendo. Aunque es útil, puede ralentizar un poco la carga del terminal. Normalmente, cuando un sistema lleva mucho tiempo en ejecución o ha pasado bastante [...]<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/02/acelerar-la-carga-del-terminal-borrando-logs-en-ubuntu/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><div class="mceTemp mceIEcenter"><dl id="attachment_1190" class="wp-caption aligncenter" style="margin:auto;width: 310px;"><dt class="wp-caption-dt"><a href="http://shakaran.net/blog/wp-content/uploads/2012/02/terminal.png"><img class="size-medium wp-image-300" title="" src="http://shakaran.net/blog/wp-content/uploads/2012/02/terminal-300x300.png" alt="Terminal" width="300" height="300" /></a></dt></dl></div><p>Por lo general, al iniciar alguna consola o terminal bash, se leen muchos <strong>archivos de configuración</strong> por defecto y se abren archivos para guardar los <strong>eventos de actividad</strong> que van ocurriendo. Aunque es útil, puede <strong>ralentizar</strong> un poco la carga del terminal.</p><p>Normalmente, cuando un sistema lleva <strong>mucho tiempo en ejecución</strong> o ha pasado bastante tiempo desde que fue instalado por primera vez, se acumulan <strong>bastantes logs</strong> de actividad de diferentes procesos.</p><p><a title="Logrotate" href="https://iain.cx/src/logrotate/" target="_blank">Logrotate</a> es una buena utilidad, activada por defecto en la mayoría de distribuciones para los archivos más importantes y que generan <strong>mayor volumen</strong> de información. Es muy útil porque ademas comprime los logs y los borra pasado un tiempo.</p><p>El problema, es que no todas las configuraciones por defecto de logrotate suministradas por la distribución, pueden resultar útiles para todos los usuarios.</p><p>Aunque se puede optar por <strong>personalizar logrotate</strong> para los archivos necesarios,&nbsp;muchas veces se desconocen cuales son todos los archivos de logs o resulta demasiado tedioso ir configurando todos, incluso aunque utilices&nbsp;sistemas automatizados como <a title="Puppet Labs" href="http://puppetlabs.com/" target="_blank">Puppet</a>.</p><p>De ahí la necesidad de crear un pequeño script de bash, más radical (bajo responsabilidad del usuario) que previo respaldo de todos los logs en el home, <strong>borre todos</strong> los archivos de log más antiguos que una determinada fecha dada en días y tambien borre archivos rotados con logrotate.</p><p>Lo he llamado <em>zerolog</em> y este es código que realiza esas tareas:</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="left2">Descargar <a href="http://shakaran.net/blog/wp-content/plugins/wp-codebox/wp-codebox.php?p=1189&amp;download=zelolog.sh">zelolog.sh</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11898"><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
</pre></td><td class="code" id="p1189code8"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env bash</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#    zerolog is a bash script for delete common logs on /var/log and</span>
<span style="color: #666666; font-style: italic;">#    avoid fill the disk with rotated files. It backups previously</span>
<span style="color: #666666; font-style: italic;">#    the logs on home folder and it can preserve logs older than</span>
<span style="color: #666666; font-style: italic;">#    a date given on days. This is useful for avoid slow sessions</span>
<span style="color: #666666; font-style: italic;">#    starts on bash terminals.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#    Copyright (C) 2012 by Ángel Guzmán Maeso, shakaran at gmail dot com</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#    This program is free software; you can redistribute it and/or modify</span>
<span style="color: #666666; font-style: italic;">#    it under the terms of the GNU General Public License as published by</span>
<span style="color: #666666; font-style: italic;">#    the Free Software Foundation; either version 3 of the License, or</span>
<span style="color: #666666; font-style: italic;">#    (at your option) any later version.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#    This program is distributed in the hope that it will be useful,</span>
<span style="color: #666666; font-style: italic;">#    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span style="color: #666666; font-style: italic;">#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
<span style="color: #666666; font-style: italic;">#    GNU General Public License for more details.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#    You should have received a copy of the GNU General Public License</span>
<span style="color: #666666; font-style: italic;">#    along with this program; if not, write to the Free Software</span>
<span style="color: #666666; font-style: italic;">#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</span>
&nbsp;
usage<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Usage: $0 [DAYS]'</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'DAYS: Remove logs older than DAYS. Default: 0 days'</span>
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">`/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">id</span> -u<span style="color: #000000; font-weight: bold;">`</span> <span style="color: #660033;">-ne</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;">echo</span> <span style="color: #ff0000;">'Please, run this script as root'</span>
    usage
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;$1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #007800;">MTIME_DAYS</span>=<span style="color: #ff0000;">''</span>
<span style="color: #000000; font-weight: bold;">else</span>
    <span style="color: #007800;">MTIME_DAYS</span>=<span style="color: #ff0000;">'-mtime +$1'</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> Currently logs <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">du</span> <span style="color: #660033;">-hs</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #ff0000;">'print $1'</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Backup the log folder on home'</span>
<span style="color: #c20cb9; font-weight: bold;">tar</span> zcPf ~<span style="color: #000000; font-weight: bold;">/</span>logs-<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #ff0000;">'+%m-%d-%y-%H:%M:%S'</span><span style="color: #000000; font-weight: bold;">`</span>.tar.gz <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Removing rotated log files'</span>
<span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #660033;">-type</span> f <span style="color: #007800;">$MTIME_DAYS</span> <span style="color: #660033;">-name</span> <span style="color: #000000; font-weight: bold;">*</span>.gz <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #ff0000;">'{}'</span> \;
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Emptying the logs'</span>
<span style="color: #000000; font-weight: bold;">for</span> logs <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log <span style="color: #007800;">$MTIME_DAYS</span> <span style="color: #660033;">-type</span> f<span style="color: #000000; font-weight: bold;">`</span>; <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$logs</span>; <span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> Currently logs <span style="color: #c20cb9; font-weight: bold;">size</span>: <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">du</span> <span style="color: #660033;">-hs</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #ff0000;">'print $1'</span><span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #000000; font-weight: bold;">`</span></pre></td></tr></table></div><p>El script esta subido a github en:</p><p><a href="https://github.com/shakaran/scripts/blob/master/zerolog.sh">https://github.com/shakaran/scripts/blob/master/zerolog.sh</a></p><p>Por si alguien quiere hacer fork, modificarlo o en un futuro hago nuevas modificaciones. Esta licenciado bajo <a title="GPLv3" href="http://gplv3.fsf.org/" target="_blank">GPLv3</a>.</p><h3><span style="color: #993300;">Ejemplos de uso</span></h3><p>Para usarlo, requiere ser <strong>administrador</strong>, ya que no todos los logs pueden borrarse como usuario regular.</p><p>Puede usarse 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('p1189code9'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p11899"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code9"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>zerolog.sh</pre></td></tr></table></div><p>Que borrará todos los <strong>logs rotados</strong> y vaciara existentes, ademas de crear un backup previo en el home del tipo <tt>logs-&lt;FECHA&gt;.tar.gz</tt> con la fecha actual de la ejecución. Por si quieres <strong>conservar los logs</strong> o decides restaurarlos por algún motivo.</p><p>Si quieres borrar sólo los más <strong>antiguos de X días</strong>, por ejemplo los más antiguos de hace una semana:</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('p1189code10'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p118910"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code10"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>zerolog.sh <span style="color: #000000;">7</span></pre></td></tr></table></div><p>Incluso puedes crearte un <strong>alias</strong>&nbsp;<em>zlog</em>:</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('p1189code11'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p118911"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code11"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">alias</span> <span style="color: #007800;">zlog</span>=<span style="color: #ff0000;">&quot;sudo sh /ruta/zerolog.sh&quot;</span></pre></td></tr></table></div><p>También puedes añadir el script como una <strong>tarea cron</strong> y que se ejecute a diario, por ejemplo:</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('p1189code12'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p118912"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code12"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> crontab <span style="color: #660033;">-e</span></pre></td></tr></table></div><p>Y añadir:</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('p1189code13'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p118913"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code13"><pre class="bash" style="font-family:monospace;"><span style="color: #000000;">0</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #c20cb9; font-weight: bold;">sh</span> <span style="color: #000000; font-weight: bold;">/</span>ruta<span style="color: #000000; font-weight: bold;">/</span>zerolog.sh <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span></pre></td></tr></table></div><p>Por otro lado, si te importan poco tus logs o quieren guardar solo los más recientes, puedes optar por una <strong>opción más drástica</strong> 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('p1189code14'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p118914"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1189code14"><pre class="bash" style="font-family:monospace;"><span style="color: #000000;">0</span> <span style="color: #000000;">0</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span> <span style="color: #660033;">-type</span> f <span style="color: #660033;">-mtime</span> +<span style="color: #000000;">7</span> <span style="color: #660033;">-exec</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #ff0000;">'{}'</span> \;<span style="color: #000000; font-weight: bold;">&amp;</span>nbsp;<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span></pre></td></tr></table></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/02/acelerar-la-carga-del-terminal-borrando-logs-en-ubuntu/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://shakaran.net/blog/2012/02/acelerar-la-carga-del-terminal-borrando-logs-en-ubuntu/</feedburner:origLink></item> <item><title>Instalar ZeroC Ice para Python en CentOS 5.7</title><link>http://feedproxy.google.com/~r/Shakaran/~3/7iVMsP6uKbA/</link> <comments>http://shakaran.net/blog/2012/02/instalar-zeroc-ice-para-python-en-centos-5-7/#comments</comments> <pubDate>Tue, 07 Feb 2012 11:37:06 +0000</pubDate> <dc:creator>shakaran</dc:creator> <category><![CDATA[CentOS]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Lenguaje C]]></category> <category><![CDATA[Open Source]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[Servidores]]></category> <category><![CDATA[software libre]]></category> <category><![CDATA[api]]></category> <category><![CDATA[aplicaciones]]></category> <category><![CDATA[aprendizaje]]></category> <category><![CDATA[arquitectura]]></category> <category><![CDATA[bindings]]></category> <category><![CDATA[centos]]></category> <category><![CDATA[compilar]]></category> <category><![CDATA[conexión]]></category> <category><![CDATA[distribuiido]]></category> <category><![CDATA[escalable]]></category> <category><![CDATA[free]]></category> <category><![CDATA[gpl]]></category> <category><![CDATA[ice]]></category> <category><![CDATA[nivel]]></category> <category><![CDATA[objetos]]></category> <category><![CDATA[plataforma]]></category> <category><![CDATA[python]]></category> <category><![CDATA[red]]></category> <category><![CDATA[repo]]></category> <category><![CDATA[repositorio]]></category> <category><![CDATA[software]]></category> <category><![CDATA[zeroc]]></category><guid isPermaLink="false">http://shakaran.net/blog/?p=1179</guid> <description><![CDATA[Ice o &#160;Internet Communications Engine&#160; es una plataforma middleware orientada a objetos, que permite escribir aplicaciones distribuidas con muy poco coste. Provee herramientas, APIs, bibliotecas y bindings para la construcciones de aplicaciones cliente-servidor de forma escalable. Es una buena herramienta de trabajo para entornos que sean bastante&#160;heterogéneos, donde el cliente y servidor puede estar escritos [...]<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/02/instalar-zeroc-ice-para-python-en-centos-5-7/" data-imageurl=""></a><script type="text/javascript" src="http://www.google.com/buzz/api/button.js"></script></div><div id="attachment_1180" class="wp-caption aligncenter" style="width: 310px"><a href="http://shakaran.net/blog/wp-content/uploads/2012/02/zeroc-ice-logo.jpg"><img class="size-full wp-image-1180" title="ZeroC Ice " src="http://shakaran.net/blog/wp-content/uploads/2012/02/zeroc-ice-logo.jpg" alt="ZeroC Ice logo" width="300" height="109" /></a><p class="wp-caption-text">ZeroC Ice logo</p></div><p>Ice o &nbsp;<a title="ZeroC Ice" href="http://zeroc.com/ice.html" target="_blank">Internet Communications Engine</a>&nbsp; es una <strong>plataforma middleware orientada a objetos</strong>, que permite escribir aplicaciones distribuidas con muy poco coste. Provee herramientas, APIs, bibliotecas y bindings para la construcciones de aplicaciones cliente-servidor de forma escalable.</p><p>Es una buena herramienta de trabajo para entornos que sean bastante&nbsp;<strong>heterogéneos</strong>, donde el cliente y servidor puede estar escritos en lenguajes de programación muy diferentes y ejecutarse sobre plataformas,&nbsp;sistemas operativos o&nbsp;arquitecturas muy variadas.</p><p>Su fuerte radica en un gran soporte de <strong>tecnologías de red</strong> con interacciones a bajo nivel de red, enfoque en la lógica de las aplicaciones y <strong>portabilidad</strong> de entornos muy diversos.</p><p>Otro punto fuerte a destacar es la&nbsp;<strong>abstracción&nbsp;de red</strong> para detalles como abrir conexiones de red, serializado y des-serializado de datos transmitidos por red, reintentos fallidos de conexión y muchos otros detalles más de bajo nivel que ayudan a simplificar la capa de red.</p><p>Soporta <strong>bindings</strong> con bastantes lenguajes de programación como:&nbsp;<br /> <a title="ZeroC Ice para C++" href="http://zeroc.com/icecpp.html" target="_blank">C++</a>,&nbsp;<a title="ZeroC Ice para .Net" href="http://zeroc.com/icedotnet.html" target="_blank">.NET</a>,&nbsp;<a title="ZeroC Ice para Java" href="http://zeroc.com/icej.html" target="_blank">Java</a>,<a title="ZeroC Ice para Python" href="http://zeroc.com/icepy.html" target="_blank">Python</a>,&nbsp;<a title="ZeroC Ice para Objetive-C" href="http://zeroc.com/iceobjc.html" target="_blank">Objective-C</a>,&nbsp;<a title="ZeroC Ice para Ruby" href="http://zeroc.com/iceruby.html" target="_blank">Ruby</a>,&nbsp;<a title="ZeroC Ice para PHP" href="http://zeroc.com/icephp.html" target="_blank">PHP</a>, y&nbsp;<a title="ZeroC Ice para ActionScript" href="http://zeroc.com/iceas.html" target="_blank">ActionScript</a>.</p><p>Debido a estas características Ice es <a title="Clientes de ZeroC Ice" href="http://www.zeroc.com/customers.html" target="_blank">usado por muchas compañias</a> con misiones críticas en el mundo. La <strong>curva de aprendizaje es sencilla</strong> y existe una gran infraestructura de aplicaciones técnicas que se demandan.</p><p>Ice es software libre bajo licencia&nbsp;<a title="Licencia GPLv2" href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" target="_blank">GPLv2</a>&nbsp;y comercializado bajo la marca <a title="ZeroC ICE" href="http://zeroc.com" target="_blank">ZeroC</a>.</p><h3><span style="color: #993300;">Instalación con repositorio</span></h3><p>Esta opción de instalación es sencilla y cómoda, pero no esta aconsejada para desarrolladores que necesiten <strong>actualizaciones</strong> con bastante frecuencia o disponer de una versión determinada.</p><p>Descargar el repo (en estos momentos de escribir el artículo para la versión 3.4) desde la página web oficial:</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('p1179code20'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p117920"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1179code20"><pre class="bash" style="font-family:monospace;"> <span style="color: #666666; font-style: italic;"># wget http://download.zeroc.com/Ice/3.4/rhel6/zeroc-ice-rhel6.repo -O /etc/yum.repos.d/zeroc-ice-rhel6.repo</span></pre></td></tr></table></div><p>Activar el repositorio e instalar ZeroC Ice y biblioteca Ice para Python:</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('p1179code21'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p117921"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1179code21"><pre class="bash" style="font-family:monospace;"> <span style="color: #666666; font-style: italic;"># yum --enablerepo zeroc-ice install -y ice ice-python</span></pre></td></tr></table></div><h3><span style="color: #993300;">Instalación desde fuentes</span></h3><p>Si tu necesidad esta más orientada al <strong>enfoque desarrollador</strong>, puedes compilar la versión que requieras o en desarrollo. En el momento de escribir este artículo se compila para la versión 3.4.2 de Ice.</p><p>Instalar <a title="mcpp: Portable C preprocessor" href="http://mcpp.sourceforge.net/" target="_blank">portable C preprocessor</a> desde el repo de ZeroC Ice (también puedes optar por <a title="Descargar mccp" href="http://mcpp.sourceforge.net/download.html" target="_blank">bajar y compilar los fuentes de mcpp</a>, pero no es necesario):</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('p1179code22'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p117922"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1179code22"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># yum install -y mcpp-devel</span></pre></td></tr></table></div><p>Después <strong>bajamos los fuentes</strong> de Ice, descomprimimos y compilamos la versión en C++ y su binding para Python (en este caso para la versión 3.4.2 de Ice). Puedes hacerlo todo en una línea 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('p1179code23'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p117923"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1179code23"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># wget http://zeroc.com/download/Ice/3.4/Ice-3.4.2.tar.gz;&amp;nbsp;tar xvzf Ice-*.tar.gz; cd Ice-*/cpp; make; make install; cd ../py/; make;make install</span></pre></td></tr></table></div><p>La instalación de Ice quedará bajo&nbsp;<tt>/opt/Ice-3.4.2/</tt> y el binding python sobre&nbsp;<tt>/opt/Ice-3.4.2/python</tt>. Es importante recalcar que el binding python se asociara con la versión de defecto de Python en el sistema si dispones de varias.</p><p>Por último, es necesario indicar el el <tt>PATH</tt> y el <tt>PYTHONPATH</tt> del sistema, donde se encuentra la instalación de Ice y su binding de Python:</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('p1179code24'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p117924"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1179code24"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># export PATH=/opt/Ice-3.4.2/bin:$PATH</span>
<span style="color: #666666; font-style: italic;"># export PYTHONPATH=/opt/Ice-3.4.2/python:$PYTHONPATH</span></pre></td></tr></table></div><p>&nbsp;</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/2012/02/instalar-zeroc-ice-para-python-en-centos-5-7/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://shakaran.net/blog/2012/02/instalar-zeroc-ice-para-python-en-centos-5-7/</feedburner:origLink></item> <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('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;">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('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
</pre></td><td class="code" id="p1143code54"><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('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;">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('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;"><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('p1143code57'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114357"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code57"><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('p1143code58'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114358"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1143code58"><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('p1143code59'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114359"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1143code59"><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('p1143code60'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114360"><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="p1143code60"><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('p1143code61'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114361"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code61"><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('p1143code62'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114362"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code62"><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('p1143code63'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114363"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code63"><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('p1143code64'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114364"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code64"><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('p1143code65'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114365"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code65"><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('p1143code66'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114366"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1143code66"><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('p1143code67'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114367"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code67"><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('p1143code68'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114368"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code68"><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('p1143code69'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114369"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code69"><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('p1143code70'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114370"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code70"><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('p1143code71'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114371"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1143code71"><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('p1143code72'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114372"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code72"><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('p1143code73'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114373"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code73"><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('p1143code74'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114374"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code74"><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('p1143code75'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114375"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code75"><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('p1143code76'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114376"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1143code76"><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('p1143code77'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114377"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code77"><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('p1143code78'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114378"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p1143code78"><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('p1143code79'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114379"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code79"><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('p1143code80'); return false;">Ver código</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p114380"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1143code80"><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> </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/36 queries in 0.035 seconds using memcached
Object Caching 2614/2680 objects using memcached

Served from: shakaran.net @ 2012-02-09 12:57:21 -->

