Mostrando entradas con la etiqueta cache. Mostrar todas las entradas
Mostrando entradas con la etiqueta cache. Mostrar todas las entradas

Memcache : guardar en cache datos SQL

Metodos para mantener en cache información que no cambiará muy seguido, y que no es necesario saturar la BD de consultas .

<?php

include 'mysql.php';

    global $memcache;
    $memcache = new Memcache;
    $memcache->pconnect('localhost',11211) or die("Conexión lenta...");

    function Get_memcache($key) {
        global $memcache;
        return ($memcache) ? $memcache->get($key) : false;
    }

    function Set_memcache($key,$object) {
        global $memcache;
        $timeout = 432000; //5dias
            return ($memcache) ?
        $memcache->set($key,$object,MEMCACHE_COMPRESSED,$timeout) : false;
    }

    function Go_memcache($key) {
        global $memcache;
           //Limpiar toda la cache : $memcache->flush();
        $identificador = md5("mysql" . $key);
        $cache = Get_memcache($identificador);
        if (!($cache)) {
           // echo "dentro";
            $db = new MySQL();
            $rs = $db->consulta(Querysql($key));
            if ($rs){
                for ($data = array (); $row = $rs->fetch_assoc(); $data[] = $row);
                Set_memcache($identificador,$data);
                $cache = Get_memcache($identificador);

            }
        }
        return $cache;
    }

    function Querysql($key){
        $sql = null;
     
        if($key==="planes")          
            $sql= "SELECT * FROM TABLA1";
     
        elseif($key==="sedes")        
            $sql= "SELECT * FROM TABLA2 ";
     

        return $sql;
       
    }

Códigos útiles .htaccess para sitios web

Hoy en día, la mayoría de ofertas de alojamiento web son para el servidor web Apache. Es una solución mucho más barata en comparación con la plataforma IIS en Windows. Apache es bien conocido por su capacidad para usar .htaccess, donde podemos controlar determinados aspectos de nuestro sitio web, incluyendo el rendimiento.

Uno de los más populares es redirigir cualquier dominio sin www al dominio con www. En este ejemplo, si intenta tener acceso a http://webempresa.com, el servidor le redirigirá a http://www.webempresa.com. Esto puede garantizar que el PageRank no se divide en dos. Para su información, Google trata a estos dos dominios como diferentes. He aquí algunos de los códigos.htaccess que se pueden utilizar en sus sitios web.

Redirigir la URL sin www a la dirección con www

Como explique anteriormente, el siguiente código redirigirá de la URL de su dominio sin www a la URL de su dominio con www.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^webempresa.com
RewriteRule (.*) http://www.webempresa.com/$1 [R=301,L] 

Como cambiar de la URL www para la dirección URL sin www

Y el siguiente código debe redirigir al usuario de la dirección URL de su dominio con www a la dirección URL sin www.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.webempresa.com [NC]
RewriteRule ^(.*)$ http://webempresa.com/$1 [L,R=301]


Impedir listar el directorio

Si tiene una carpeta en el servidor web utilizada para almacenar archivos como los e-docs, software legal, etc,, si la carpeta no tiene archivo index.html, los visitantes pueden ver todos los archivos dentro de la carpeta sin problemas. En este caso puede utilizar el código siguiente para evitar que esto suceda.

Options -Indexes

Orden de ejecución de archivos

Si tiene tanto el archivo index.html como el archivo index.php en la carpeta /public_html, el archivo index.html tiene mayor prioridad y se ejecutara en primer lugar. Aunque la mayoría de scripts web utilizan el archivo index.php como punto de partida. Si se puede eliminar el archivo index.html, se soluciona el problema, aunque no siempre es asi y en estos casos hay una mejor solución que es utilizar el siguiente código para dar prioridad al archivo index.php en vez de index.html.

DirectoryIndex index.php index.html

Comprimir archivos CSS, JavaScript, XML y texto

El siguiente código está diseñado para comprimir el código de salida CSS, JavaScript, XML y de texto antes de ser mostrado en el navegador. La idea básica es ahorrar tiempo en la carga y no consumir tanto ancho de banda.


AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript


Almacenamiento en caché de imágenes

Cada vez que recibimos visitas en la web, el servidor web obtiene todos los archivos necesarios, tales como archivos CSS y JavaScript, así como fotos e imágenes para poder mostrarla. Podemos usar el código de abajo para gestionar los archivos de caché, y que cuando un visitante vuelva a visitarnos por segunda vez, el servidor cargue el archivo de la caché lo que acelerará el tiempo de carga sitio web.


ExpiresActive On
ExpiresByType image/gif A432000
ExpiresByType image/jpg A432000
ExpiresByType image/jpeg A432000
ExpiresByType image/png A432000
ExpiresByType image/ico A432000
ExpiresByType image/bmp A432000
ExpiresByType text/css A432000
ExpiresByType text/javascript A432000
ExpiresByType application/javascript A432000
ExpiresByType application/x-javascript A432000


El código anterior guarda caché de los archivos durante cinco días o 432.000 segundos. Puede cambiar el período de almacenamiento en caché, asegurándose de utilizar el valor expresado en segundos.

Proteger el archivo .htaccess

El siguiente código evita que su archivo .htaccess puedan ser leído directamente desde el navegador web.


order allow,deny
deny from all

Prevenir el hotlinking

A veces, otros webmasters, hacen suyas las imágenes de nuestras webs, artículos, etc., afectando con ello el ancho de banda de que disponemos en nuestro Hosting. Si ademas ellos tienen una gran cantidad de visitantes al día, estos van a utilizar nuestro ancho de banda del servidor para visualizar nuestras imagenes en la web ajena a nosotros. Se puede utilizar el código que se muestra a continuación para evitar el hotlinking, y de esta forma reemplazar la imagen original por otra con algún aviso para hacerles saber que la imagen es nuestra o que el hotlinking es una mala práctica.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?webempresa\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpg|gif|bmp|png)$ http://hotlink.webempresa.com/no_se_permite_hotlinking.jpg [L]


Puede subir la imagen a un sitio de alojamiento de imágenes como ImageShack para evitar que su ancho de banda se vea afectado.

Cambiar la ubicación de la carpeta de dominio a otra carpeta de /public_html

Si ya tiene un sitio web en el /public_html, y quiere actualizar la página web, pero no quiere que los demás lo vean, pero tampoco quiere afectar al sitio web en producción existente, la forma más fácil es la construcción de la nueva página web en una subcarpeta de /public_html, por ejemplo, /public_html/web2.

Al finalizar todas las pruebas y mejoras, quiere reemplazar el antiguo sitio web con el nuevo pero transferir archivos y carpetas a la carpeta /public_html es bastante molesto. La mejor solución es usar.htaccess para decirle a Apache que utilice la carpeta /public_html/web2 en lugar de /public_html para el dominio.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^webempresa\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.webempresa\.com$
RewriteCond %{REQUEST_URI} !^/web2/
RewriteRule (.*) /web2/$1 [L]


Crear URLs de uso fácil o "amigables"

¿Cuál de las dos URL a continuación parece más amigable?

http://tusitio.com/acercade
http://tusitio.com/paginas/acercade.html


Cuando se trata de direcciones URL, siempre y cuando el significado sea claro, cuanto más corto es, mejor. htaccess con una llamada al módulo de Apache mod_rewrite permite configurar las direcciones URL como quieras. El servidor puede mostrar el contenido de "/paginas/acercade.html" cada vez que alguien visita "http://tusitio.com/acercade".

A continuación algunos ejemplos:

RewriteEngine on
RewriteRule ^acercade/$ /paginas/acercade.html [L]
RewriteRule ^caracteristicas/$ /caracteristicas.php [L]
RewriteRule ^comprar/$ /comprar.html [L]
RewriteRule ^contacto/$ /paginas/contacto.htm [L]


Forzar el uso de SSL

Este código fuerza a utilizar SSL, no permitiendo conexiones http. Para evitar escuchas en http:// utilizamos por debajo la directiva ErrorDocument.

SSLOptions + StrictRequire
SSLRequireSSL


Cuando una línea comienza por # es un comentario que no tiene ningún efecto.

Cuando alguien visita su sitio el servidor web Apache verifica si tiene un archivo .htaccess en algún lugar de su espacio web a partir de la carpeta raíz o la carpeta principal y rastrea todas las carpetas hasta llegar al archivo solicitado. Si encuentra un archivo .htaccess, sus directivas se aplican a la solicitud actual.

Es importante saber que el archivo .htaccess debe ser legible por el servidor Apache. Por tanto es importante consultar con su Hosting si se requiere algún permiso especial que hayan establecido para los archivos .htaccess. En general los permisos correctos para este archivo son 644.

Estas apenas son unas pinceladas de las muchas posibilidades que tiene la correcta gestión del archivo .htaccess que en la mayoría de sitios webs, del nivel que sean, suele pasar desapercibido y es relegado al estatus de un archivo más, cuando el potencial del mismo es tan grande como quiera otorgarle el usuario.

Como hacer más rápida la carga de una página web en un servidor Apache

Configurar en el archivo .htaccess de un servidor Apache, los parámetros Expires y Cache-Control para hacer cacheables las páginas y lograr que carguen con más velocidad y rapidez. Reducir y minimizar las peticiones HTTP. Elevar el rendimiento de un sitio web y reducir el ancho de banda necesario.
Como hacer más rápida la carga de una página web en un servidor ApacheUnos de los métodos más prácticos, sencillos y recomendados para lograr que una página web o blog, cargue más rápidamente, es configurar los parámetros necesarios en el servidor web donde está alojada.
Esto permite hacer cacheables las paginas, o sea mantener en la memoria del navegador los elementos que la componen. 
Todos los navegadores poseen una cache (memoria) para reducir el tamaño y la cantidad de peticiones HTTP necesarias.
Los servidores pueden usar los parámetros Expires o Cache-Control Header en las respuestas, para informarle al navegador del cliente, el tiempo que puede ser cacheado un componente o elemento de la página solicitada.
Agregando solo unas líneas en el archivo de configuración del servidor, puedes hacer que las páginas de tu sitio web carguen un 40% más rápido en el navegador de tus lectores.



Pasos al solicitar una página web a un servidor con el navegador web


¿Que significa todo esto?
Al usuario hacer la solicitud al navegador de cargar determinada página web, primeramente se establece una conexión preliminar entre este y el servidor, en la cual se intercambian varios datos como los encabezados HTTP o headers, permisos necesarios, etc.
Uno de los datos que devuelve el servidor, es el tiempo de duración que podrán tener los diferentes archivos en la cache o memoria del navegador, de forma predeterminada este tiempo es corto para asegurar la frescura de lo que se muestra al usuario.



Peticiones HTTP innecesarias realizadas


Un ejemplo, al cargarse una página llamada imágenes-lindas.htm en un sitio web al que nunca se ha accedido con anterioridad, el navegador necesita de un tiempo determinado para mostrarla completamente, este tiempo está en relación con la cantidad de elementos que la componen y la velocidad de la conexión.
Existe gran cantidad de páginas en la red que contienen multitud de elementos, ya sea imágenes, archivos flash, scripts, hojas de estilo css, etc. por lo que es necesario varias peticiones de forma simultánea. 
Accedes a la misma página imágenes-lindas.htm, dos días después y el navegador requerirá casi el mismo tiempo, como si fuera la primera vez ya que tendrá que cargar todos los elementos de nuevo.

Ventajas de evitar las peticiones HTTP innecesarias


Estableciendo los parámetros de Expires o de Cache-Control, para que permanezcan más tiempo en la cache, elementos que no se modifican frecuentemente como imágenes, archivos flash y que además requieren de varias peticiones cada vez que se acceda a dicha página, hará que en futuros accesos los elementos citados de cargarán de la cache, por lo que la velocidad de carga casi será instantánea.
Este método ofrece dos ventajas:
• Se reduce el tiempo de carga de la página web, al reducir la cantidad de peticiones HTTP necesarias.
• Se reduce por lo tanto el tamaño de las peticiones trayendo consigo el consumo de menos ancho de banda y el incremento del rendimiento general.



¿Cómo conocer la configuración actual de mi servidor?


Puede comprobarse facilmente el tiempo que permanece en la cache del navegador, los elementos de una página determinada, para eso haz lo siguiente:
En el navegador Google Chrome introduce en la barra de direcciones:
chrome://view-http-cache/http://norfipc.com/
Sustituye "http://norfipc.com" por la dirección URL de la página solicitada.
Chrome mostrará los encabezados HTTP y entre ellos el valor de "Cache-Control" y de "Expires", si así están configurados en el servidor web que aloja dicha página.
En el navegador Google Chrome también puede usar las herramientas de desarrolladores, que devuelve toda la información necesaria.



Como usar la consola de Chrome para ver los encabezados HTTP


Hazlo de la siguiente forma:
• Da un clic en la esquina superior derecha del navegador y escoge: Herramientas -> Herramientas para desarrolladores.
• Un clic en la pestaña "Network"
• Recarga la página (F5)
• En la lista de archivos escoge la página principal, en este ejemplo: index.html
• Abre la pestaña "Headers" para ver los encabezados.
Se muestra "Request Headers" (encabezados enviados por el navegador) y "Response Headers" (respuestas del servidor web)
En la siguiente imagen que es una captura de pantalla, solo mostramos las respuestas, puede verse los valores de Cache-Control y de Expires que usamos en nuestro sitio.
Usar la consola del navegador Google Chrome para ver los encabezados HTTP



Parámetros que definen el tiempo en la cache del navegador de los elementos de las páginas


Los parámetros que definen en un servidor que utilice Apache, el tiempo en que el navegador puede usar los recursos de la cache son: Expires y Cache-Control: max-age.
Especifican el tiempo de frescura (freshness lifetime) que es el tiempo durante el cual el navegador puede usar la cache sin comprobar si existe una nueva versión disponible en el servidor.
Se ha hablado de las ventajas que son indudables, la desventaja es que un cliente puede acceder a una página web que ha sido modificada recientemente y no percatarse ni darse cuenta de los cambios efectuados, ya que el navegador solo mostrará lo que posee guardado en la cache, a no ser que se refresque el navegador mediante el botón correspondiente o la tecla F5.
De los dos parámetros: Expires y Cache-Control: max-age solo es posible utilizar uno de los dos, no se puede emplear los dos simultáneamente.

¿Cómo configurar los encabezados Expires y Cache-Control en Apache?


En los servidores Apache se pueden configurar los parámetros de su funcionamiento de dos formas.
1- En el archivo httpd.conf, principal herramienta de configuración del servidor, solo el administrador tiene el acceso y los permisos para modificarlo.
2- El archivo .htaccess, archivo individual de cada subdominio en el que se pueden establecer muchos de los parámetros aplicables en este caso solo a los archivos donde se encuentre.
Es el método más práctico y sencillo y el único que podemos usar si alojamos nuestro sitio en un servidor de terceros.

¿Qué es el archivo .htaccess en Apache, como configurarlo?


Es solo un sencillo archivo de texto plano que para los usuarios de Windows luce algo diferente, no posee nombre, solo la extensión de archivo .htaccess.
Si tratas de crear un archivo así en Windows lógicamente recibirás un mensaje de error, pero es posible copiar o descargar una a nuestro equipo y modificarlo.
Descarga más abajo un archivo .htaccess de ejemplo.
Puedes emplear un archivo .htaccess en cualquier carpeta o subcarpeta del servidor para especificar los parámetros de ese directorio.
Si lo usas en un servidor local, tienes que asegurarte que en el archivo httpd.conf, esté especificado: "AllowOverride All" en los permisos del directorio raiz donde se va a usar, si no es así no tendrá efecto, por ejemplo:
<Directory "C:/servidor/ejemplo"> 
AllowOverride None
</Directory> 



¿Cómo usar los encabezados Cache-Control para hacer las páginas cacheables?


Solo es necesario copiar y pegar el siguiente código en un archivo .htaccess:
# 1 MES
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|js|xml|txt|css)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

# 1 SEMANA
<FilesMatch "\.(html|htm|php)$">
Header set Cache-Control "max-age=604800, public, must-revalidate"
</FilesMatch>
El carácter # significa que la línea es un comentario.
En este ejemplo se emplean dos opciones diferentes para un mes y una semana respectivamente.
La primera opción establece para todos los archivos de imágenes, flash y otros archivos auxiliares, un mes la duración de la cache. Todos los archivos que posean las extensiones: 
ico|pdf|flv|jpg|jpeg|png|gif|swf|js|xml|txt|css. Puedes agregar cualquier otro a la lista.
La segunda opción se usa solo para los archivos html, htm y php que son los que con más frecuencia se modifican en mi sitio, en este caso especifíca la duración en cache de una semana.
Si deseas especificar para esos u otros tipos de archivo un tiempo superior o inferior, utiliza las siguientes opciones, solo introduce las extensiones de los archivos necesarias.
# 1 AÑO
<FilesMatch "\.()$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>

# 1 DIA
<FilesMatch "\.()$">
Header set Cache-Control "max-age=86400, must-revalidate"
</FilesMatch>
Descarga un archivo .htaccess de ejemplo y que te servirá de plantilla.

Descargar archivo .htaccess Descargar archivo .htaccess

¿Cómo usar el encabezado Expires para hacer las páginas cacheables?


Google recomienda el uso del encabezado Expires en vez de Cache-Control por ser soportado de forma más amplia.
Expires es posible emplearlo en Apache mediante dos directivas: ExpiresDefault y ExpiresByType, el primero define de forma general como debe el navegador cachear los recursos y con el segundo se puede definir, de acuerdo al tipo de archivo.
En ambos casos el tiempo a perdurar el documento en la cache del navegador, se puede establecer con el parámetro "access" y a continuación un intervalo.
Se pueden utilizar los siguientes intervalos:
years, months, weeks, days, hours, minutes, seconds
El uso de ExpiresDefault es sencillo, solo es necesario especificar en el archivo .htaccess dos líneas.

Ejemplo para que perdure por un año (Intervalo máximo para no violar las normas del RFC):
ExpiresActive on
ExpiresDefault "access plus 1 year"

Ejemplo para que perdure por seis meses:
ExpiresActive on
ExpiresDefault "access plus 6 months"

Utilizar ExpiresByType sería similar, pero especificando cada tipo de archivo, por ejemplo:
ExpiresActive on
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType text/javascript "access plus 2 weeks"

La solución ideal puede ser combinando ambas directivas.
El siguiente ejemplo (recomendado) es para usarlo en un sitio web, en el que se modifique frecuentemente el contenido de las páginas (solo el texto):
ExpiresActive on
ExpiresDefault "access plus 6 months"
ExpiresByType text/html "access plus 2 weeks"

Otras formas de usar la directiva Expires, utilizando el intervalo en segundos.
ExpiresActive On
ExpiresDefault A0
# 1 AÑO
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>

# 1 MES
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A2592000
</FilesMatch>

# 1 SEMANA
<FilesMatch "\.(txt|xml|js|css|htm|html|php)$">
ExpiresDefault A604800
</FilesMatch>
El tiempo se expresa en AXXX, donde XXX son los segundos que posee el intervalo.

Precauciones al hacer cacheables las páginas web


Pero ¡Cuidado!, si se hacen todos los elementos de una página cacheables, se corre el riesgo de que el usuario al solicitarla no la cargue del servidor, vea solo la copia en la cache del navegador, esto trae como consecuencia que no existirá acceso físico a tu sitio y no contará como una visita. Siempre es necesario para evitar lo anterior, que algunos de los elementos de la página tengan un tiempo de expiración corto.
No es nada difícil, para eso puede insertarse un snippet de Facebook o el +1 de Google, expiran en minutos.
Si no sabes como hacerlo lee la siguiente página: Como insertar los botones Me Gusta y plusone +1 en las páginas web

Desactivar el parámetro ETags


Otro parámetro que de paso podemos configurar en el archivo .htaccess adecuadamente es: ETags.
Para verificar si un archivo en un servidor es el mismo que el que se encuentra en la cache del navegador se usan dos parámetros: Last-Modified y ETags, no se pueden usar simultáneamente, si no de forma alternativa de la misma forma que Expires y Cache-Control.
Para conocer si tu servidor web utiliza Last-Modified o ETags accede a Gtmetrix y haz una simple prueba a cualquier página de tu sitio.
Entity tags (ETags) es un mecanismo creado para determinar cuando el contenido en la cache en el navegador coincide con el que se encuentra en el servidor web, esto ocasiona conflictos en los casos de una misma información almacenada en diferentes servidores, con el objetivo de asegurar una efectiva dispersión geográfica, ya que no coinciden exactamente, en estos casos el navegador perderá tiempo haciendo consecutivas peticiones con el objetivo de comprobar y validar las fechas.
Si no necesitas en lo absoluto utilizar las posibilidades de validación que ETags provee, es recomendado desactivarlo por completo, para eso solo es necesario incluir en el archivo .htaccess la siguiente línea:
FileETag none
Es necesario esperar por el reinicio del servidor para que los cambios tomen efecto.

¿Cómo comprobar el resultado de los cambios realizados?


Para comprobar los efectos en el rendimiento de un sitio web donde se efectúen los cambios, utiliza cualquiera de los servicios para comprobar la velocidad de carga de cualquier página que se encuentre alojada en dicho sitio o subdominio donde se utilice y modifique el archivo .htaccess antes y despues.
Puedes utilizar:
◄ Gtmetrix
◄ Page Speed de Google en tu navegador web.
◄ Page Speed Online.
Todos los cambios anteriores también se pueden efectuar en un servidor local previamente.

Páginas donde encontrar mas información online


Todas las recomendaciones anteriores son aconsejadas y han sido tomadas de las siguientes páginas, en las que puedes encontrar más información útil para mejorar e incrementar la velocidad en tu sitio web.

Best Practices for Speeding Up Your Web Site.
http://developer.yahoo.com/performance/rules.html

Speed Up Sites with htaccess Caching.
http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html

Optimize caching
http://code.google.com/speed/page-speed/docs/caching.html

Nueva extensión OPcache con PHP

La nueva extensión OPcache de PHP 5.5

PHP es un lenguaje de programación interpretado, lo que significa que cada vez que se ejecuta un archivo PHP, primero debe compilarse. Si un archivo no cambia con frecuencia, resulta absurdo perder el tiempo compilando una y otra vez un archivo que no ha cambiado.
Por ese motivo, hace muchos años surgieron sistemas de caché como APC que guardan los archivos compilados y los utilizan mientras el archivo original no cambie. Si activas APC es fácil multiplicar el rendimiento de la aplicación entre 2 y 10 veces sin tocar una sola línea de código.
La versión 5.5 de PHP introduce una nueva caché llamada OPcache y que está destinada a reemplazar a APC. En realidad, OPcache es el nuevo nombre del producto Zend Optimizer+ que la empresa Zend lleva años utilizando en sus servicios. Esto significa que OPcache es un producto maduro y probado en miles de servidores de todo tipo. Además, OPcache es hasta un 20% más rápido que APC en muchas pruebas de rendimiento con aplicaciones PHP típicas (ver pruebas de rendimiento).

Instalando la extensión OPcache

Si utilizas PHP 5.5, OPcache ya está instalado y configurado. Si utilizas PHP 5.2, 5.3 o 5.4, puedes emplear el paquete ZendOpcache de PECL correspondiente a tu versión.
Si ya la tienes instalada y no te aparece dentro de las extensiones activadas, puede que tengas que añadir o descomentar la siguiente línea en tu archivo php.ini:
; en servidores Linux y Mac
zend_extension=/ruta/hasta/la/librería/opcache.so
 
; en servidores Windows
zend_extension=C:\ruta\hasta\el\archivo\php_opcache.dll
Si además de OPcache utilizas la extensión Xdebug, asegúrate de cargar primero la extensión OPcache dentro de tu archivo de configuración.

Configurando la extensión OPcache

El manual oficial de PHP recomienda la siguiente configuración para la extensión OPcache:
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
La siguiente tabla explica cada una de estas opciones y también indica su valor por defecto:
OpciónValor inicialDescripción
opcache.enable1Activa la extensión. Cambia su valor a 0 para desactivar OPcache
opcache.enable_cli0Activa OPcache cuando se ejecuta PHP en la línea de comandos
opcache.memory_consumption64Cantidad de memoria en MB que puede consumir la caché de OPcache
opcache.interned_strings_buffer4Cantidad de memoria en MB utilizada para guardar cadenas de texto que se pueden calcular en tiempo de compilación en vez de ejecución
opcache.max_accelerated_files2000Número máximo de archivos que se compilan. El valor debe estar entre 200 y 100.000
opcache.revalidate_freq2Cada cuantos segundos se comprueba si un archivo compilado ha cambiado. Si el valor es 0, se comprueba en cada petición. Para desactivar esta comprobación, utiliza la opciónopcache.validate_timestamps
opcache.fast_shutdown0Si se activa, la extensión OPcache no libera la memoria ocupada, sino que delega esa tarea en el gestor de memoria del motor Zend de PHP. Activar esta opción mejora el rendimiento, pero la memoria se reserva durante más tiempo
Si comparas la tabla anterior (que muestra los valores por defecto de OPcache) con la configuración que recomiendan en el manual oficial de PHP (mostrada anteriormente), verás que la configuración recomendada es más apropiada para aplicaciones PHP complejas, como por ejemplo las que utilizan frameworks como Symfony y Zend.
Al margen de las recomendaciones anteriores, la mejor configuración siempre es la que se ajusta mejor a tu servidor y tus aplicaciones. No olvides probar diferentes valores para cada opción de configuración y analiza las mejoras o pérdidas de rendimiento que consigues con cada cambio. Así conseguirás llegar a la configuración ideal para tu servidor.

Configuración avanzada

La extensión OPcache tiene muchas otras opciones que puedes configurar. Para aquellos programadores que utilizan frameworks como Symfony y Zend o librerías como Doctrine2, la opciónopcache.save_comments es realmente importante.
El valor por defecto de esta opción es 1, lo que significa que se mantienen todos los comentarios del código fuente de los archivos que se compilan. Si cambias su valor a 0, todos los comentarios se eliminan, lo que mejora el rendimiento y reduce significativamente el tamaño de los archivos compilados.
El problema es que si eliminas los comentarios, es posible que estés rompiendo el código de Symfony, Doctrine, PHPUnit y muchas otras aplicaciones que utilizan unos comentarios especiales llamados anotaciones para modificar el comportamiento del código.
Así que si utilizas Symfony, Doctrine, Zend Framework o PHPUnit, asegúrate de tener la opción opcache.save_comments=1 o tu aplicación dejará de funcionar.
Otra opción muy importante es opcache.enable_file_override, cuyo valor inicial es 0. Si cambias su valor a 1, cada vez que en tu aplicación ejecutes las funciones file_exists()is_file() yis_readable(), se comprueba primero si el archivo que pasas como argumento a las funciones anteriores ha sido cacheado. Esta comprobación puede mejorar el rendimiento, pero a cambio corres el riesgo de estar comprobando archivos cacheados que ya no existen o han cambiado.
La siguiente tabla recoge el resto de opciones disponibles en OPcache. A menos que sepas muy bien lo que estás haciendo, es mejor que no modifiques el valor de estas opciones:
OpciónValor inicialDescripción
opcache.max_wasted_percentage5Porcentaje máximo de memoria desperdiciada que se tolera antes de forzar un reinicio de OPcache
opcache.use_cwd1Si se activa, OPcache añade el directorio al nombre de cada archivo que cachea, por lo que se reducen las posibles colisiones entre archivos con el mismo nombre
opcache.validate_timestamps1Si se activa, los archivos cacheados se comprueban periódicamente para ver si han cambiado. Si se desactiva el rendimiento aumenta muchísmo, pero a cambio debes reiniciar el servidor web o borrar la caché a mano cada vez que cambies un archivo
opcache.revalidate_path0Los archivos cacheados con el mismo nombre y el mismo include_path se reutilizan (puede haber problemas con archivos con el mismo nombre pero distinta localización)
opcache.load_comments1Si se desactiva, los comentarios del código fuente no se cargan, aunque los archivos cacheados mantengan esos comentarios
opcache.optimization_level0xffffffffSu formato es el de una máscara de bits que indica cuáles de las diferentes pasadas de OPcache se ejecutan
opcache.inherited_hack1Opción válida sólo para PHP 5.2 y qu evita un bug relacionado con la herencia de clases
opcache.dups_fix0Activa esta opción si se producen errores de tipo "Cannot redeclare class"
opcache.blacklist_filename''Ruta donde se encuentra el archivo que indica qué archivos no se deben cachear (puedes indicar directorios enteros e incluso nombres de archivos con asteriscos. Ej:*Repositroy.php)
opcache.max_file_size0Máximo tamaño de archivo en bytes que se puede guardar en la caché. El valor 0 indica que no hay límites
opcache.consistency_checks0Si es distinto de 0 la consistencia de la caché se comprueba cada N peticiones, donde N es el valor de esta opción
opcache.force_restart_timeout180Duranción en segundos del tiempo que se espera hasta reiniciar OPcache en caso de que la caché no responda
opcache.error_log''Ruta del archivo donde se registrarán los errores que se produzcan
opcache.log_verbosity_level1Máximo nivel de errores que se guardan en el log. Por defecto, solamente los errores de tipofatal y error
opcache.preferred_memory_model''No toques esta opción si no sabes lo que estás haciendo. Esta opción te permite elegir el tipo de memoria a utilizar entre los siguientes valores: mmapshmposix y win32
opcache.protect_memory0Opción reservada para la depuración interna de OPcache
opcache.mmap_basenullUtilizada solamente para indicar la base de los segmentos de memoria compartida en Windows

Utilizando la configuración de APC en OPcache

Si estás acostumbrado a utilizar la caché APC, la siguiente tabla muestra el equivalente en OPcache de las opciones de configuración más habituales de APC:
APCOPcache
apc.enabled=1opcache.enable=1
apc.shm_segments=1 yapc.shm_size=128Mopcache.memory_consumption=128
apc.num_files_hint=4000opcache.max_accelerated_files=4000
apc.stat=1opcache.validate_timestamps=1
apc.max_file_size=2Mopcache.max_file_size=2
apc.filters="/var/www/apc.php"opcache.blacklist_filename="/var/www/opcache.txt"

Funciones de OPcache

La extensión OPcache incluye dos funciones muy útiles cuando se utiliza la caché en el servidor de producción. La primera función es opcache_reset() que no admite parámetros y devuelve como resultado un valor booleano. El propósito de esta función es borrar toda la caché de OPcache(equivale a al función apc_clear_cache()).
Si utilizas la opción opcache.validate_timestamps=0 e instalas una nueva versión de tu aplicación en el servidor, los cambios no se tendrán en cuenta hasta que caduquen los archivos cacheados. La solución más drástica suele ser reiniciar el servidor, pero con la función opcache_reset() puedes obtener el mismo resultado de forma más elegante.
La otra opción definida por OPcache es opcache_invalidate(), que no borra toda la memoria caché sino un único archivo cacheado:
// borra el archivo 'index.php' de la caché solamente si es más
// nuevo que el archivo 'index.php' cacheado
opcache_invalidate('index.php');
 
// borra el archivo 'index.php' de la caché (sin importar
// su fecha de modificación)
opcache_invalidate('index.php', true);

CommentFB