<?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; apc</title>
	<atom:link href="http://www.phpbsd.net/tag/apc/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>Cache en memoria compartida con APC</title>
		<link>http://www.phpbsd.net/2007/05/02/cache-en-memoria-compartida-con-apc/</link>
		<comments>http://www.phpbsd.net/2007/05/02/cache-en-memoria-compartida-con-apc/#comments</comments>
		<pubDate>Wed, 02 May 2007 18:37:23 +0000</pubDate>
		<dc:creator>Oriol</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[memoria-compartida]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://www.phpbsd.net/2007/05/02/cache-en-memoria-compartida-con-apc/</guid>
		<description><![CDATA[Como continuación del anterior post voy a explicar brevemente como montar una cache de objetos en memoria compartida usando APC. Esto nos permite disponer de una cache accesible para cualquier proceso Apache que se esté ejecutando en el servidor. Podemos guardar cualquier variable (resultados de queries, páginas html, cualquier tipo de objeto, etc.) y esta [...]


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/16/cache-de-paginas-estaticas-para-php/' rel='bookmark' title='Permanent Link: Cache de páginas estáticas para PHP'>Cache de páginas estáticas para PHP</a></li><li><a href='http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/' rel='bookmark' title='Permanent Link: Optimización del rendimiento de ADOdb en PHP'>Optimización del rendimiento de ADOdb en PHP</a></li></ul>]]></description>
			<content:encoded><![CDATA[<p>Como continuación del anterior post voy a explicar brevemente como montar una <strong>cache de objetos en memoria compartida</strong> usando <a target="_blank" href="http://www.php.net/manual/en/ref.apc.php" title="PHP: Alternative PHP Cache - Manual">APC</a>. Esto nos permite disponer de una cache accesible para cualquier proceso Apache que se esté ejecutando en el servidor. Podemos guardar cualquier variable (resultados de queries, páginas html, cualquier tipo de objeto, etc.) y esta se conservará entre las distintas peticiones hasta que la borremos de cache o expire el TTL que queramos.</p>
<p>Una forma rápida de ver su uso es con un ejemplo:</p>
<div class="syntax_hilite">
<div id="php-3">
<div class="php"><span style="color:#0000FF;">$obj</span> = <span style="color:#000000; font-weight:bold;">new</span> Objeto<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
apc_store<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'key'</span>,<a href="http://www.php.net/serialize"><span style="color:#000066;">serialize</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$obj</span><span style="color:#006600; font-weight:bold;">&#41;</span>,<span style="color:#CC66CC;">3600</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#0000FF;">$result</span> = <a href="http://www.php.net/unserialize"><span style="color:#000066;">unserialize</span></a><span style="color:#006600; font-weight:bold;">&#40;</span>apc_fetch<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'key'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<a href="http://www.php.net/var_dump"><span style="color:#000066;">var_dump</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$result</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Usando <a target="_blank" href="http://www.php.net/manual/en/function.apc-store.php" title="PHP: apc_store - Manual">apc_store()</a> guardamos <em>$obj</em> en cache durante una hora. Podemos recuperar o borrar <em>$obj</em> de la cache usando el identificador <em>key</em>. Es necesario realizar serialize/unserialize si guardamos datos como objetos o arrays, para variables simples no es necesario.</p>
<p>Para borrar el anterior objeto de cache:</p>
<div class="syntax_hilite">
<div id="php-4">
<div class="php">apc_delete<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'key'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</div>
</div>
<p></p>
<p>Para evitar el uso de <em>define</em> el cual es bastante lento disponemos de <a target="_blank" href="http://www.php.net/manual/en/function.apc-define-constants.php" title="PHP: apc_define_constants - Manual">apc_define_constants()</a> y <a target="_blank" href="http://www.php.net/manual/en/function.apc-load-constants.php" title="PHP: apc_load_constants - Manual">apc_load_constants()</a> para guardar y recuperar constantes de cache.</p>
<p>El APC ofrece una interfaz gráfica para ver el uso que hacemos de la cache, que opciones tenemos activas, archivos "compilados", variables almacenadas, etc. a la vez que nos permite borrar todo el contenido de la cache. Podemos obtener la misma información con la función <a target="_blank" href="http://www.php.net/manual/en/function.apc-cache-info.php" title="PHP: apc_cache_info - Manual">apc_cache_info()</a> y para borrar la cache tenemos <a target="_blank" href="http://www.php.net/manual/en/function.apc-clear-cache.php" title="PHP: apc_clear_cache - Manual">apc_clear_cache()</a> aunque la interfaz gráfica no deja de ser interesante.</p>
<p>Un snapshot de ejemplo:</p>
<p><img src="http://www.phpbsd.net/wp-content/images/snapshot_apc.png" alt="APC snapshot" /></p>
<p>Para instalarla en FreeBSD se trata de copiar el archivo <em>/usr/local/share/doc/APC/apc.php</em> en algún lugar dentro de nuestro document root del Apache.</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/16/cache-de-paginas-estaticas-para-php/' rel='bookmark' title='Permanent Link: Cache de páginas estáticas para PHP'>Cache de páginas estáticas para PHP</a></li><li><a href='http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/' rel='bookmark' title='Permanent Link: Optimización del rendimiento de ADOdb en PHP'>Optimización del rendimiento de ADOdb en PHP</a></li></ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpbsd.net/2007/05/02/cache-en-memoria-compartida-con-apc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalación del APC (Alternative PHP Cache) sobre FreeBSD</title>
		<link>http://www.phpbsd.net/2007/04/26/instalacion-del-apc-alternative-php-cache-sobre-freebsd/</link>
		<comments>http://www.phpbsd.net/2007/04/26/instalacion-del-apc-alternative-php-cache-sobre-freebsd/#comments</comments>
		<pubDate>Thu, 26 Apr 2007 21:10:58 +0000</pubDate>
		<dc:creator>Oriol</dc:creator>
				<category><![CDATA[Artículos]]></category>
		<category><![CDATA[apc]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[freebsd]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[webmaster]]></category>

		<guid isPermaLink="false">http://www.phpbsd.net/2007/04/26/instalacion-del-apc-alternative-php-cache-sobre-freebsd/</guid>
		<description><![CDATA[Como prometía en el post dedicado a la optimización de ADOdb voy a explicar como instalar el sistema de cache APC sobre un servidor FreeBSD 6.x. El APC (Alternative PHP Cache) es un sistema de cache de opcode para PHP, sirve para cachear el código intermedio del PHP y así no tener que interpretar todos [...]


Entradas relacionadas:<ul><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/2006/09/22/la-primera-beta-del-freebsd-62-ya-esta-disponible/' rel='bookmark' title='Permanent Link: La primera beta del FreeBSD 6.2 ya está disponible'>La primera beta del FreeBSD 6.2 ya está disponible</a></li><li><a href='http://www.phpbsd.net/2006/07/27/terminadas-las-elecciones-del-nuevo-core-team-del-freebsd/' rel='bookmark' title='Permanent Link: Terminadas las elecciones del nuevo Core Team del FreeBSD'>Terminadas las elecciones del nuevo Core Team del FreeBSD</a></li></ul>]]></description>
			<content:encoded><![CDATA[<p>Como prometía en el post dedicado a la <a href="http://www.phpbsd.net/2006/12/06/optimizacion-del-rendimiento-de-adodb-en-php/" title="Optimización del rendimiento de ADOdb en PHP en PHPBSD.net">optimización de ADOdb</a> voy a explicar como instalar el sistema de cache <strong>APC sobre un servidor FreeBSD 6.x</strong>. El <a target="_blank" href="http://www.php.net/manual/en/ref.apc.php" title="PHP: Alternative PHP Cache - Manual">APC</a> (Alternative PHP Cache) es un sistema de cache de <a target="_blank" href="http://en.wikipedia.org/wiki/Opcode" title="Opcode - Wikipedia, the free encyclopedia">opcode</a> para PHP, sirve para cachear el código intermedio del PHP y así no tener que interpretar todos los scripts en cada ejecución. Para almacenar este código "compilado" se usa la memoria compartida del sistema. A parte el APC nos ofrece funciones para poder almacenar y recuperar datos de cache.</p>
<p>El APC es una extensión <a target="_blank" href="http://pecl.php.net/package/apc" title="PECL :: Package :: APC">PECL</a> que no viene incluida por defecto con el PHP (esto cambiará con la futura versión 6). A continuación describo como instalar y configurar el APC sobre FreeBSD.</p>
<p><strong>[1] Instalar el port</strong></p>
<p>Suponiendo que tenemos instalado y funcionando un servidor web (Apache+PHP) sólo nos falta añadirle la extensión PECL con:</p>
<p><code># portinstall pecl-APC</code></p>
<p>Si no trabajas con portupgrade:</p>
<p><code># cd /usr/ports/www/pecl-APC/<br />
# make install clean</code></p>
<p>Con esto compilamos e instalamos el APC. Si todo va bien acabará el proceso y podremos ver esta nueva linea en el archivo <em>/usr/local/etc/php/extensions.ini</em>:</p>
<p><code>extension=apc.so</code></p>
<p>Cuando lo compilas se dan a escoger tres opciones: MMAP, SEMAPHORES y PHP4_OPT. Es aconsejable seleccionar sólo MMAP y si trabajas con PHP4 la última también. La opción de SEMAPHORES dependiendo de tu sistema puede provocar cierta inestabilidad y no ofrece muchas mejoras en rendimiento.</p>
<p>La última versión del APC (pecl-APC-3.0.14) se compila siempre con soporte mmap aunque desactives la opción (o esto es lo que me pasa a mi en los servidores bajo FreeBSD).</p>
<p>Ahora sólo falta configurar correctamente las directivas apropiadas en el php.ini y un restart (o reload) del Apache.</p>
<p><strong>[2] Configurando el APC</strong></p>
<p>La configuración por defecto del APC es apropiada en muchas situaciones aunque bajo FreeBSD deberíamos configurar correctamente el tamaño de memoria compartida. Esto se consigue con las siguientes directivas:</p>
<p><code>apc.shm_segments=1<br />
apc.shm_size=32</code></p>
<p>En FreeBSD el tamaño de memoria compartida por defecto es de 32MB. Puedes optar por aumentarlo o por dejarlo igual y usar varios segmentos configurando la directiva <em>apc.shm_segments</em>. Para aumentar el tamaño de la memoria compartida a 128MB en FreeBSD:</p>
<p><code># sysctl kern.ipc.shmmax=134217728<br />
# sysctl kern.ipc.shmall=32768</code></p>
<p>Si quieres conservar estos valores después de reiniciar el sistema debes añadirlos en <em>/etc/sysctl.conf</em>.</p>
<p>Se debe fijar SHMALL (kern.ipc.shmall) a SHMMAX/PAGE_SIZE. Este valor en el ejemplo descrito de 128MB de memoria compartida nos queda como: 134217728/4096 = 32768. Puedes ejecutar el comando <em>pagesize</em> para conocer el tamaño de una página de memoria (PAGE_SIZE) en tu sistema y <em>ipcs -M</em> para verificar la configuración de la memoria compartida.</p>
<p>También hacer notar en este punto que con la última versión del APC bajo FreeBSD no permite usar varios segmentos de memoria compartida y estás obligado a sólo usar un segmento, si necesitas más memoria debes aumentar el tamaño de memoria compartida del sistema.</p>
<p>El resto de directivas de configuración dependen mucho del tipo de aplicación PHP. Dependiendo del número de visitas, cantidad de archivos a cachear, frecuencia de cambio de los archivos, etc. Una configuración de ejemplo con pequeñas notas acerca del significado de las directivas usadas (en el archivo <em>/usr/local/share/doc/APC/INSTALL</em> tienes todas las directivas disponibles detalladas):</p>
<p><code>; Activa el APC<br />
apc.enabled=1<br />
; Número de segmentos de memoria compartida<br />
apc.shm_segments=1<br />
; Tamaño de la memoria compartida<br />
apc.shm_size=128<br />
; Un número aproximado de archivos fuente a cachear<br />
apc.num_files_hint=6000<br />
; Un número aproximado de variables a cachear<br />
apc.user_entries_hint=100<br />
; Segundos que dejamos en cache una entrada que ya no se usa<br />
apc.ttl=600<br />
; Idem al anterior pero para las variables de usuario<br />
apc.user_ttl=600<br />
; Segundos que dejamos una entrada cacheada en el recolector de basura<br />
apc.gc_ttl=0<br />
; Indica si se cachea por defecto.<br />
apc.cache_by_default=On<br />
; Expresiones regulares para saber que archivos cacheamos<br />
; Resulta útil si se usa en combinación con la directiva anterior<br />
apc.filters=""<br />
; Indica si se activa el APC para el modo CLI del PHP<br />
apc.enable_cli=0<br />
; Indica el tamaño máximo de archivos a cachear<br />
apc.max_file_size=1M<br />
; Indica si el APC ha de verificar si los archivos han sido modificados<br />
; para actualizar la cache<br />
apc.stat=1</code></p>
<p>De todos los cacheadores de código que he usado APC es con diferencia el más estable aunque no es perfecto. En situaciones de mucho tráfico y si constantemente estás cambiando los archivos al final consigues un fantástico <a target="_blank" href="http://en.wikipedia.org/wiki/Segmentation_fault" title="Segmentation fault - Wikipedia, the free encyclopedia">segfault</a> del Apache. Una gran opción si dispones de una aplicación que no está en constante desarrollo es usar la directiva <em>apc.stat</em> a 0, con este parámetro consigues mucha más estabilidad.</p>
<p>Es un gran invento y es muy recomendable su uso, puedes llegar a ver loads de CPU reducidos al 50% y ganar un 20% de memoria. Pero como todo tiene bugs y al menos yo en el escenario donde lo uso (decenas de millones de páginas vistas por mes + clúster de decenas de servidores BSD) es un tanto inestable en ciertas situaciones... pero mucho más estable que algo como EAccelerator el cual en el anterior escenario no aguanta ni 5 minutos.</p>
<p>Si usas APC sobre FreeBSD en webs con mucho tráfico y no tienes ni un segfault nunca... no te cortes y comenta que directivas/opciones estás usando.</p>
<p>En un siguiente post explicaré como usar las funciones que proporciona el APC para almacenar datos de aplicación en cache.</p>


<p>Entradas relacionadas:<ul><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/2006/09/22/la-primera-beta-del-freebsd-62-ya-esta-disponible/' rel='bookmark' title='Permanent Link: La primera beta del FreeBSD 6.2 ya está disponible'>La primera beta del FreeBSD 6.2 ya está disponible</a></li><li><a href='http://www.phpbsd.net/2006/07/27/terminadas-las-elecciones-del-nuevo-core-team-del-freebsd/' rel='bookmark' title='Permanent Link: Terminadas las elecciones del nuevo Core Team del FreeBSD'>Terminadas las elecciones del nuevo Core Team del FreeBSD</a></li></ul></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpbsd.net/2007/04/26/instalacion-del-apc-alternative-php-cache-sobre-freebsd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

