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

<channel>
	<title>PHPBSD.net &#187; adodb</title>
	<atom:link href="http://www.phpbsd.net/tag/adodb/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpbsd.net</link>
	<description>Blogueando sobre PHP, BSD, SEO, AJAX, Seguridad, Rendimiento... y mucho más</description>
	<lastBuildDate>Thu, 07 Oct 2010 11:57:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Optimización del rendimiento de ADOdb en PHP</title>
		<link>http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/</link>
		<comments>http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/#comments</comments>
		<pubDate>Wed, 06 Dec 2006 03:39:20 +0000</pubDate>
		<dc:creator>Oriol</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[adodb]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/</guid>
		<description><![CDATA[ADOdb es una librería de abstracción de base de datos para PHP muy potente. Dispone de una cantidad de usuarios y casos de éxito importante y ofrece muchas funcionalidades interesantes con soporte para una buena lista de engines de BD. Es un proyecto maduro, iniciado el año 2000, que si no conoces se merece una [...]


Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/04/26/instalacion-del-apc-alternative-php-cache-sobre-freebsd/' rel='bookmark' title='Permanent Link: Instalación del APC (Alternative PHP Cache) sobre FreeBSD'>Instalación del APC (Alternative PHP Cache) sobre FreeBSD</a></li><li><a href='http://www.phpbsd.net/2007/05/02/cache-en-memoria-compartida-con-apc/' rel='bookmark' title='Permanent Link: Cache en memoria compartida con APC'>Cache en memoria compartida con APC</a></li><li><a href='http://www.phpbsd.net/2008/04/11/optimizacion-de-aplicaciones-php-server-side/' rel='bookmark' title='Permanent Link: Optimización de aplicaciones PHP (server side)'>Optimización de aplicaciones PHP (server side)</a></li></ul>]]></description>
			<content:encoded><![CDATA[<p>ADOdb es una librería de abstracción de base de datos para PHP muy potente. Dispone de una cantidad de usuarios y casos de éxito importante y ofrece muchas funcionalidades interesantes con soporte para una buena lista de engines de BD. Es un proyecto maduro, iniciado el año 2000, que si no conoces se merece una ojeada en su <a title="ADOdb Database Abstraction Library for PHP (and Python)" target="_blank" href="http://adodb.sourceforge.net/">página oficial</a>.</p>
<p>Como consecuencia de la cantidad de funcionalidades que ofrece es un layer tirando a lento (existen alternativas más rápidas y limpias). Esto es debido a que es un proyecto enorme con miles de lineas de código algunas de ellas, desgraciadamente, de no mucha calidad. Aunque a mi personalmente me gusta mucho y en todo proyecto software existen algunas partes un poco feas.</p>
<p>Dependiendo de la carga del site donde uses ADOdb o dependiendo de si necesitas todas sus funcionalidades es aconsejable estudiar bien otras alternativas mucho más lights. Como <a title="ADOdb Lite" target="_blank" href="http://adodblite.sourceforge.net/index.php">ADOdbLite</a> (simulando ADOdb pero mucho más optimizada y con muchas menos funcionalidades), <a target="_blank" title="The PHP Data Objects (PDO) extension" href="http://www.php.net/manual/en/ref.pdo.php">PDO</a> (dispone de las características más importantes de ADOdb, es más rápida y se ha convertido en el estándar), <a title="PEAR MDB2" target="_blank" href="http://pear.php.net/package/MDB2">PEAR MDB2</a> (sucesora de la clásica DB, potente y bastante rápida). Según John Lim, ADOdb no es que sea tan lenta, pero si la usas en un site con bastante carga y no realizas ninguna de las optimizaciones aquí descritas puedes estar perdiendo unos cuantos segundos en el total de una sesión de usuario (decenas o centenares de ms por página), y muchísimos más si entramos en el tema del uso de la cache de queries (que con esto ADOdb no es precisamente el culpable sino que proporciona un sistema de cache para el acceso a BD).</p>
<p>Es cierto que ADOdb arrasa en funcionalidades sobre las tres alternativas que he comentado pero como en muchas situaciones en el desarrollo en PHP vale la pena valorar las funcionalidades versus rendimiento. Estudiar bien el uso que le vamos a dar a la librería, la carga del site. frecuencia de las queries (dependiendo del tipo de web o de si disponemos de caches de contenido), etc.</p>
<p>Si a pesar de lo anterior te encanta ADOdb y lo quieres utilizar o si ya lo usas en algún proyecto y no puedes asumir un cambio, aquí van algunos consejos para mejorar el rendimiento del acceso a BD (optimizaciones para la librería y como usar la cache de queries).</p>
<p><strong>[1]</strong> Usar la extensión de C de ADOdb. Si la instalas la librería PHP del ADOdb se encargará de usarla, aunque también puedes usar directamente las funciones adodb_* en tu código. Puedes descargarla <a title="Download adodb-ext-504.zip" target="_blank" href="http://phplens.com/lens/dl/adodb-ext-504.zip">aquí</a>, dentro del archivo están las instrucciones para su instalación (archivo README.txt).</p>
<p><strong>[2]</strong> Sobretodo, si tiras de la versión PHP de la librería usar un acelerador de código con opcode cache. Como <a title="The Alternative PHP Cache (APC)" target="_blank" href="http://www.php.net/manual/en/ref.apc.php">APC</a> o <a title="eAccelerator: PHP Accelerator, optimizer, dynamic content cache - Trac" target="_blank" href="http://eaccelerator.net/">EAccelerator</a>. Con sites con mucha carga, por mi experiencia personal, APC lo considero un sistema mucho más estable que el EA. El APC se instala como una extensión PECL del PHP.</p>
<p><strong>[3]</strong> Usar la cache de ADOdb para tus queries. Esto se consigue con el uso de CacheExecute(). De las queries ejecutadas con este método se almacenan los recordsets devueltos a disco, esto es, con las siguientes queries idénticas el ADOdb devuelve el objeto serializado de disco hasta que no caduque.</p>
<p>Para poder usar CacheExecute() es necesario crear un directorio para la cache e iniciar el ADOdb como sigue:</p>
<div class="syntax_hilite">
<div id="php-5">
<div class="php"><span style="color:#0000FF;">$ADODB_CACHE_DIR</span> = <span style="color:#FF0000;">'/var/directorio_para_la_cache'</span>;<br />
<span style="color:#0000FF;">$db</span> = NewADOConnection<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$dsn</span>.<span style="color:#FF0000;">'/'</span>.<span style="color:#0000FF;">$dbname</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">SetFetchMode</span><span style="color:#006600; font-weight:bold;">&#40;</span>ADODB_FETCH_ASSOC<span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Para lanzar una query almacenando cache durante un día:</p>
<div class="syntax_hilite">
<div id="php-6">
<div class="php">try <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; <span style="color:#0000FF;">$sql</span> = <span style="color:#FF0000;">'SELECT id FROM datos WHERE nombre=&quot;'</span>.<span style="color:#0000FF;">$n</span>.<span style="color:#FF0000;">'&quot;'</span>;<br />
&nbsp; <span style="color:#0000FF;">$rs</span>=<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">CacheExecute</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC66CC;">86400</span>,<span style="color:#0000FF;">$sql</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; <span style="color:#FF9933; font-style:italic;">// ...</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span> catch <span style="color:#006600; font-weight:bold;">&#40;</span>ADODB_Exception <span style="color:#0000FF;">$e</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; <span style="color:#FF9933; font-style:italic;">// ...</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Contando claro que trabajamos con PHP5 y que hemos cargado el soporte para exceptions del ADOdb. Esto se consigue añadiendo:</p>
<div class="syntax_hilite">
<div id="php-7">
<div class="php"><span style="color:#616100;">require_once</span> <span style="color:#FF0000;">'adodb/adodb-exceptions.inc.php'</span>;</div>
</div>
</div>
<p></p>
<p><strong>[4]</strong> Es interesante valorar <a title="memcached: a distributed memory object caching system" target="_blank" href="http://www.danga.com/memcached/">memcached</a> como sustituto de la cache a disco por defecto. ADOdb incluye el código necesario para usarlo. Memcached es teóricamente más rápido que el acceso a los recordsets serializados a disco, aunque la principal ventaja que ofrece es la reutilización de la cache entre distintos servidores.</p>
<p>Una vez instalado memcached, para iniciarlo:</p>
<p><code># memcached -d -m 512 -l 127.0.0.1 -p 11211 -u www</code></p>
<p>Para iniciar el daemon con 512 MB de memoria escuchando sólo en localhost y corriendo como usuario www. Cambiar 127.0.0.1 por la IP de vuestro servidor tanto en el comando como en el código PHP que sigue, y www por el usuario que ejecute el Apache. Es necesario instalar una <a title="Memcache Functions" target="_blank" href="http://www.php.net/manual/en/ref.memcache.php">extensión PECL</a> para trabajar con memcached.</p>
<p>Para iniciar ADOdb y indicar que queremos usar memcached para nuestros CacheExecute:</p>
<div class="syntax_hilite">
<div id="php-8">
<div class="php"><span style="color:#0000FF;">$db</span> = NewADOConnection<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$dsn</span>.<span style="color:#FF0000;">'/'</span>.<span style="color:#0000FF;">$dbname</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">SetFetchMode</span><span style="color:#006600; font-weight:bold;">&#40;</span>ADODB_FETCH_ASSOC<span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">memCache</span> = <span style="color:#000000; font-weight:bold;">true</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">memCacheHost</span> = <span style="color:#FF0000;">'localhost'</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">memCachePort</span> = <span style="color:#CC66CC;">11211</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">memCacheCompress</span> = <span style="color:#000000; font-weight:bold;">false</span>;<br />
<span style="color:#0000FF;">$db</span>-&gt;<span style="color:#006600;">cacheSecs</span> = <span style="color:#CC66CC;">86400</span>;</div>
</div>
</div>
<p></p>
<p><strong>[5]</strong> Aunque bastante incómodo y en algunos casos peligroso (futuros ALTER TABLE) es más rápido acceder directamente a $recordset->fields mediante el ID numérico y fijar la variable $ADODB_FETCH_MODE = ADODB_FETCH_NUM.</p>
<p><strong>[6]</strong> Finalmente podemos mirar de ejecutar los métodos _Execute() y _query() para lanzar nuestras queries. Estos son métodos mucho más crudos. _Execute() a diferencia de Execute() no emula binding, p.e. necesario para usar Prepare() si nuestra BD no lo soporta nativamente. Por el otro lado _query() si que es mucho más limitado, a parte de no emular binding tampoco devuelve recordset y no tiene debugging.</p>
<p>Con todo lo anterior podemos tener ADOdb bastante más optimizado aunque si tenemos un nuevo proyecto por delante quizás lo más aconsejable es usar PDO dado que todo apunta a que se convertirá en el estándar a seguir para el acceso a base de datos en PHP.</p>
<p>Acerca del tema de la cache de queries, sin ánimo de alargar más el post, sólo decir que es mucho más óptimo usar memcached para cachear objetos que no cachear las queries necesarias para generar estos objetos... si disponemos de unos buenos sistemas de caches de contenido (p.e. squid) y un sistema de cache de objetos genérico (memcached) cachear las queries deja de ser tan importante aunque te ofrece otro nivel de cache para jugar.</p>
<p>En un siguiente post dedicado a los sistemas de cache en PHP explicaré con más detalles como trabajar con APC y Memcached sobre servidores FreeBSD.</p>


<p>Entradas relacionadas:<ul><li><a href='http://www.phpbsd.net/2007/04/26/instalacion-del-apc-alternative-php-cache-sobre-freebsd/' rel='bookmark' title='Permanent Link: Instalación del APC (Alternative PHP Cache) sobre FreeBSD'>Instalación del APC (Alternative PHP Cache) sobre FreeBSD</a></li><li><a href='http://www.phpbsd.net/2007/05/02/cache-en-memoria-compartida-con-apc/' rel='bookmark' title='Permanent Link: Cache en memoria compartida con APC'>Cache en memoria compartida con APC</a></li><li><a href='http://www.phpbsd.net/2008/04/11/optimizacion-de-aplicaciones-php-server-side/' rel='bookmark' title='Permanent Link: Optimización de aplicaciones PHP (server side)'>Optimización de aplicaciones PHP (server side)</a></li></ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

