Usando PEAR para almacenar en buffer programas PHP
El almacenamiento en búfer es un tema candente en el mundo de PHP, porque las páginas dinámicas generadas por PHP deben recalcularse cada vez que el usuario las solicita, independientemente de si el resultado de la solicitud es el mismo. Al mismo tiempo, PHP compila el script cada vez. Sin duda, una sobrecarga así sería insoportable para un sitio web con mucho tráfico. Afortunadamente, los resultados de la Web se pueden almacenar en caché sin necesidad de volver a ejecutar y compilar el script. Los productos comerciales como ZendCache o el Alternate PHP Cache de código abierto proporcionan una forma de compilar scripts PHP en código de bytes y almacenarlos en caché.
El paquete de almacenamiento en búfer de PEAR proporciona un marco para almacenar en búfer contenido dinámico, consultas de bases de datos y llamadas a funciones PHP.
Así como Perl tiene CPAN y TeX tiene CTAN, PHP también tiene su propia biblioteca de recursos central para almacenar clases, bibliotecas y módulos. Esta biblioteca se llama PEAR (Repositorio de complementos y extensiones PHP).
Este artículo asume que ha instalado el entorno PEAR. De lo contrario, puede descargarlo desde el sitio web de PHP. El paquete de buffer de PEAR contiene una clase de buffer general y varias subclases especializadas. Las clases de búfer utilizan clases de contenedor para almacenar y administrar datos almacenados en búfer.
Los siguientes son los contenedores que contiene actualmente el búfer PEAR y sus respectivos parámetros:
archivo: el contenedor de archivos almacena datos almacenados en el búfer en el sistema de archivos y es el contenedor más rápido.
cache_dir: este es el directorio donde el contenedor almacena los archivos.
filename_prefix: el prefijo de los archivos almacenados en caché, por ejemplo: "cache_".
shm: el contenedor shm coloca los datos almacenados en el búfer en la memoria compartida. Los puntos de referencia muestran que con la implementación actual, este contenedor es más lento que el contenedor de archivos.
shm_key: la clave utilizada por la memoria compartida.
shm_perm: permiso para utilizar segmentos de datos de memoria compartida.
shm_size: tamaño de la memoria compartida asignada.
sem_key: el valor clave del semáforo.
sem_perm: permisos para el semáforo.
db: capa de abstracción de la base de datos de PEAR.
dsn: el DSN de la conexión de la base de datos. Puede consultar la documentación de la base de datos de PEAR.
cache_table: el nombre de la tabla.
phplib: el contenedor phplib utiliza una capa de abstracción de base de datos para almacenar buffers.
clase_db
archivo_db
ruta_bd
archivo_local
ruta_local
ext/dbx: extensión de la capa de abstracción de la base de datos de PHP. Si desea almacenar buffers en la base de datos, puede usar este contenedor.
módulo
anfitrión
base de datos
nombre de usuario
contraseña
tabla_caché
persistente
La mejora de rendimiento obtenida al utilizar PEAR Cache depende del contenedor de búfer que elija. Por ejemplo, no tiene sentido almacenar los resultados de la base de datos nuevamente en el caché de la base de datos.
El módulo de búfer de funciones de PEAR Cache puede almacenar en búfer los resultados de cualquier función o método, ya sea una función incorporada de PHP o una función definida por el usuario. Utiliza un contenedor de archivos de forma predeterminada y coloca los datos almacenados en un búfer en un directorio llamado function_cache.
El constructor de la clase Cache_Function puede tener tres parámetros opcionales:
$contenedor: el nombre del contenedor del búfer.
$container_options: parámetros de matriz del contenedor del búfer.
$expires: el tiempo (en segundos) en que expira el objeto del búfer.
Cuando una llamada de función normal utiliza el método call() de la clase Cache_Function, se puede activar el almacenamiento en búfer. Llamar a call() es fácil, un argumento es el nombre de la función, luego los argumentos de la función, el segundo argumento es la primera de las funciones que se llamará, y así sucesivamente, veamos un ejemplo:
Ejemplo 1 Llamar a funciones y métodos de búfer
// Llama al búfer de función de PEAR Cache.
require_once 'Caché/Función.php';
// Definir algunas clases y funciones.
clase foo {
barra de funciones ($ prueba) {
echo "foo::bar($prueba)
";
}
}
barra de clase {
función foobar($objeto) {
echo '$'.$objeto.'->foobar('.$objeto.')
';
}
}
$barra = nueva barra;
función foobar() {
eco 'foobar()';
}
// Obtener el objeto Cache_Function
$caché = nueva Cache_Function();
// Almacena en buffer la función estática bar() de la clase foo (foo::bar()).
$cache->call('foo::bar', 'prueba');
// $barra->foobar()
$cache->call('barra->foobar', 'barra');
$cache->call('foobar');
?>
A continuación usamos Cache_Output para almacenar en buffer la salida:
Ejemplo 2 Salida del script de almacenamiento en búfer
//Carga el buffer de salida de PEAR Cache
require_once 'Caché/Salida.php';
$cache = new Cache_Output('archivo', array('cache_dir' => '.') );
// Calcule la marca de la página que se va a almacenar en el búfer, asumimos que el almacenamiento en el búfer de la página depende de
// URL, variables HTTP GET y POST y cookies.
$cache_id = $cache->generarID(
matriz('url' => $REQUEST_URI, '
publicación' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) );
//búfer de consulta
si ($contenido = $cache->start($cache_id)) {
// golpe de búfer
eco $contenido;
morir();
}
//búfer perdido
// -- Inserta contenido aquí para generar código --
// Almacena la página en el buffer
echo $caché->end();
?>
Con la clase Cache_Output, es fácil convertir una aplicación de sitio web dinámica basada en una base de datos en una estática, mejorando así en gran medida el rendimiento del sitio. Cada vez más sitios utilizan GZIP para comprimir contenido HTML, lo que reduce el consumo de ancho de banda del servidor y también puede beneficiar mucho a los usuarios que utilizan Modem para acceder a Internet.
Cache_OutputCompression amplía la funcionalidad de la clase Cache_Output. Almacena en búfer el contenido HTML comprimido con GZIP, ahorrando así tiempo de compresión de la CPU.