<?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>Desarrollo web &#187; apc</title>
	<atom:link href="http://www.proyecto-f.net/tag/apc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.proyecto-f.net</link>
	<description>javascript, jquery, css, php y adobe premiere</description>
	<lastBuildDate>Tue, 13 Apr 2010 05:32:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Duplicar la velocidad de wordpress en 5 minutos</title>
		<link>http://www.proyecto-f.net/2009/09/duplicar-la-velocidad-de-wordpress-en-5-minutos/</link>
		<comments>http://www.proyecto-f.net/2009/09/duplicar-la-velocidad-de-wordpress-en-5-minutos/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 05:57:24 +0000</pubDate>
		<dc:creator>flmn</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.proyecto-f.net/?p=1009</guid>
		<description><![CDATA[El almacenamiento en cache es una técnica muy empleada que arroja importantes mejoras de rendimiento y requiere de muy poco esfuerzo. 
Los tipos de cache se pueden dividir en dos grupos principales, cache del lado del servidor (opcodes, bases de datos, etc) y del lado del cliente cliente (imágenes, hojas de estilos, ficheros js).
NOTA: Las [...]]]></description>
			<content:encoded><![CDATA[<p>El almacenamiento en cache es una técnica muy empleada que arroja importantes mejoras de rendimiento y requiere de muy poco esfuerzo. </p>
<p>Los tipos de cache se pueden dividir en dos grupos principales, cache del lado del servidor (opcodes, bases de datos, etc) y del lado del cliente cliente (imágenes, hojas de estilos, ficheros js).</p>
<p>NOTA: Las siguiente optimizaciones han sido realizadas sobre wordpress pero son perfectamente aplicables a cualquier aplicación php.</p>
<h3>Cache del lado del servidor</h3>
<p>Lo primero será instalar algún optimizador de código php. Ya hemos hablado varias veces de este tipo de soluciones así que no me voy a complicar demasiado. Simplemente decir que APC y eAccelerator son buenas alternativas.</p>
<h3>Cache del lado del cliente</h3>
<p>En la mayoría de los casos, queremos que nuestros cliente caché de nuestros archivos estáticos como HTML y CSS para que el sitio cargue más rápido después de la primera solicitud. El almacenamiento en caché del navegador depende por lo general de las cabeceras HTTP y el navegador utilizando. Una vez que el browser tiene algún elemento de nuestra página en cache, realizara una de las siguientes acciones dependiendo de la cabecera utilizada:</p>
<p><img src="http://www.proyecto-f.net/wp-content/uploads/2009/09/304-not-modified.jpg" alt="304-not-modified" title="304-not-modified" width="429" height="89" class="alignleft size-full wp-image-1010" /></p>
<p>   1. Comprobara en cada petición si el archivo ha sido modificado. Si la respuesta de estado es HTTP 304 (no modificado) cargara el fichero desde la cache.<br />
   2. No realizara ninguna comprobación y cargara el archivo desde la cache hasta que este caduque.<br />
<span id="more-1009"></span><br />
El segundo caso es más rápido ya que ahorra una gran cantidad de peticiones HTTP. </p>
<h3>Establecer la cebecera Expires </h3>
<p>Para forzar el segundo caso echaremos mano de el fichero .htaccess una vez más y aplicaremos la siguiente regla para decirle a el browser que los ficheros con las siguientes extensiones no caducan hasta el año 2012:<br />
<code><br />
&lt;FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$"><br />
Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT"<br />
Header unset ETag<br />
FileETag None<br />
&lt;/FilesMatch><br />
</code></p>
<p>Para el que lo prefiera también podemos añadir reglas similares en el archivo de configuración de apache:<br />
<code><br />
&lt;Virtualhost><br />
......<br />
ExpiresActive On<br />
ExpiresByType image/gif A604800<br />
ExpiresByType image/png A604800<br />
ExpiresByType image/jpeg A604800<br />
ExpiresByType text/css A604800<br />
ExpiresByType text/javascript A604800<br />
ExpiresByType application/x-javascript A604800<br />
ExpiresByType text/html A300<br />
ExpiresByType text/xml A300<br />
ExpiresByType application/x-shockwave-flash A604800<br />
ExpiresByType video/x-flv A604800<br />
&lt;/Virtualhost><br />
</code><br />
En este caso le indicamos el número de segundos que tardan los ficheros en caducar (A300 = 300 segundos).</p>
<h3>Plugins para Wordpress</h3>
<p>Por último wordpress cuenta con algunos plugins como db cache o wp super cache que nos pueden ayudar a restarle más carga a nuestro servidor. En las pruebas que he realizado sobre este blog la mejora ha sido casi inapreciable, de todas formas, no descarto que esta pueda ser mucho mayor en blogs con bases de datos mayores o configuraciones distintas.</p>
<h3>Los resultados</h3>
<p><a>Wordpress</a></p>
<pre>
Concurrency Level:      20
Time taken for tests:   61.333 seconds
Complete requests:      141
Failed requests:        0
Write errors:           0
Total transferred:      6077689 bytes
HTML transferred:       6039609 bytes
Requests per second:    2.30 [#/sec] (mean)</pre>
<p><a>WP + APC</a></p>
<pre>
Concurrency Level:      20
Time taken for tests:   60.946 seconds
Complete requests:      173
Failed requests:        0
Write errors:           0
Total transferred:      6919990 bytes
HTML transferred:       6877150 bytes
Requests per second:    2.84 [#/sec] (mean)
</pre>
<p><a>WP + APC + .HTACCESS</a></p>
<pre>
oncurrency Level:      20
Time taken for tests:   60.326 seconds
Complete requests:      255
Failed requests:        0
Write errors:           0
Total transferred:      10200281 bytes
HTML transferred:       10136973 bytes
Requests per second:    4.23 [#/sec] (mean)
</pre>
<p><a>WP + APC + .HTACCESS + DB CACHE</a></p>
<pre>
Concurrency Level:      20
Time taken for tests:   60.350 seconds
Complete requests:      262
Failed requests:        0
Write errors:           0
Total transferred:      10253142 bytes
HTML transferred:       10189596 bytes
Requests per second:    4.34 [#/sec] (mean)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.proyecto-f.net/2009/09/duplicar-la-velocidad-de-wordpress-en-5-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barra de progreso de Uploads en PHP sin Flash</title>
		<link>http://www.proyecto-f.net/2009/09/barra-de-progreso-de-uploads-en-php/</link>
		<comments>http://www.proyecto-f.net/2009/09/barra-de-progreso-de-uploads-en-php/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 19:12:40 +0000</pubDate>
		<dc:creator>flmn</dc:creator>
				<category><![CDATA[artículos]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.proyecto-f.net/?p=872</guid>
		<description><![CDATA[Hace ya tiempo que conozco/uso APC, una librería para PHP cuyo propósito es acelerar la ejecución y optimizar el consumo de recursos de nuestros scripts mediante el cacheo de opcodes.

Para mi sorpresa, hoy descubro que APC cuenta además con algunos extras como la directiva rfc1867 (compatible con  php 5.2 y superior) que nos permite [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya tiempo que conozco/uso <a title="opcode cache for PHP" target="_blank" href="http://es.php.net/apc">APC</a>, una librería para PHP cuyo propósito es acelerar la ejecución y optimizar el consumo de recursos de nuestros scripts mediante el cacheo de opcodes.<br />
<!--Por poner un ejemplo: En mi laptop mi configuración actual de wordpress, con 5 plugins activos, reduce su consumo de memoria desde los 15,61Mb hasta 4,7Mb activando APC. La sección de noticias tampoco queda atrás pasando de 1.3Mb y 0.04 segundos de tiempo de ejecución a 0.37Mb y 0.03 segundos (La reducción de tiempos no es especialmente significativa ya que el cuello de botella de la aplicación esta en la base de datos, la mejora es mucho más holgada para scripts que no dependan de aplicaciones externas).--></p>
<p>Para mi sorpresa, hoy descubro que <strong>APC cuenta además con algunos extras</strong> como la directiva rfc1867 (compatible con  php 5.2 y superior) <strong>que nos permite crear barras de progreso para uploads, sin hacer uso de flash</strong>, como se muestra en el siguiente video.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/aXZ3WYdB5sQ&#038;hl=en&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/aXZ3WYdB5sQ&#038;hl=en&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p><span id="more-872"></span></p>
<p>Lo primero es instalar APC, puedes seguir <a href="http://es.php.net/apc">la guía de php.net</a>. Una vez instalado será suficiente con añadir estas dos líneas en el php.ini y reiniciar apache.</p>
<p><code>extension=php_apc.dll<br />
apc.rfc1867 = On </code></p>
<p><strong>El formulario</strong><br />
<img src="http://www.proyecto-f.net/wp-content/uploads/2009/09/Picture-11.png" alt="Upload form" title="Upload form" width="439" height="191" class="alignleft size-full wp-image-886" /><br />
El formulario de upload requerirá de un identificador único, bastara con añadir un campo oculto;<br />
<code>&lt;input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="&lt;?php echo $unique_id?>"/&gt;</code></p>
<p><strong>PHP</strong><br />
Llegado a este punto toca crear un script php que nos muestre el estado del envió, este será consultado cada cierto tiempo con llamadas ajax.</p>
<p><code><br />
&lt;?php<br />
if(isset($_GET['progress_key'])) {<br />
  $status = apc_fetch('upload_'.$_GET['progress_key']);<br />
  echo $status['current']/$status['total']*100;<br />
}<br />
?&gt;</code></p>
<p><strong>Javascript</strong><br />
Ya solo nos quedaría el código javascript que lanza las llamadas ajax. Es importante no olvidarnos de enviar el identificador del upload en la llamada.</p>
<p><code><br />
function getProgress(){<br />
  GDownloadUrl("getprogress.php?progress_key=&lt;?php echo($unique_id)?&gt;",<br />
               function(percent, responseCode) {<br />
                   document.getElementById("progressinner").style.width = percent+"%";<br />
                   if (percent < 100){<br />
                        setTimeout("getProgress()", 100);<br />
                   }<br />
               });<br />
}<br />
function startProgress(){<br />
    document.getElementById("progressouter").style.display="block";<br />
    setTimeout("getProgress()", 1000);<br />
}<br />
</code></p>
<p>Y Eso es todo. En <a target="_blank" href="http://www.ibm.com/developerworks/library/os-php-v525/index.html">este</a> y <a  target="_blank" href="http://webreflection.blogspot.com/2007/10/upload-progress-bar-with-php5-apc-and.html">este enlace</a> encontrareis más información y un .zip en descarga directa con todos los archivos ,a modo de demo, listos para probar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.proyecto-f.net/2009/09/barra-de-progreso-de-uploads-en-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

