May 02

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 se conservará entre las distintas peticiones hasta que la borremos de cache o expire el TTL que queramos.

Una forma rápida de ver su uso es con un ejemplo:

[php] $obj = new Objeto();
apc_store(‘key’,serialize($obj),3600);
$result = unserialize(apc_fetch(‘key’));
var_dump($result); [/php]

Usando apc_store() guardamos $obj en cache durante una hora. Podemos recuperar o borrar $obj de la cache usando el identificador key. Es necesario realizar serialize/unserialize si guardamos datos como objetos o arrays, para variables simples no es necesario.

Para borrar el anterior objeto de cache:

[php] apc_delete(‘key’); [/php]

Para evitar el uso de define el cual es bastante lento disponemos de apc_define_constants() y apc_load_constants() para guardar y recuperar constantes de cache.

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 apc_cache_info() y para borrar la cache tenemos apc_clear_cache() aunque la interfaz gráfica no deja de ser interesante.

Un snapshot de ejemplo:

APC snapshot

Para instalarla en FreeBSD se trata de copiar el archivo /usr/local/share/doc/APC/apc.php en algún lugar dentro de nuestro document root del Apache.

Tagged with:
Apr 25

Una de las técnicas más habituales en el desarrollo de aplicaciones PHP orientadas a objetos es crear un archivo fuente para cada definición de clase. Con esta técnica es necesario hacer require de muchos archivos en el código para cada ejecución. Nuestro fantástico PHP5 nos ofrece la posibilidad de cargar automáticamente las clases que necesita bajo demanda definiendo la función __autoload().

Otra gran ventaja de usar autoload es que nos aseguramos de que sólo incluimos las definiciones de las clases que realmente usamos. Es frecuente en la vida de una aplicación que debido a actualizaciones se nos queden requires de clases que ya no usamos o que por ejemplo tengamos la costumbre de hacer todos los requires que va a usar una clase en la cabecera, entonces para ejecutar un sólo método que quizás sólo usa un par de clases estamos cargando clases innecesarias.

A pesar de que normalmente el uso de autoload provoca una mejora importante en el rendimiento ya que sólo se cargan las clases que usamos se ha de tener en cuenta que el código que tengamos en la función __autoload() debe ser lo más ligero posible ya que dependiendo del tamaño de la aplicación se va a ejecutar muchísimas veces.

Una función __autoload() de ejemplo podría ser algo como:

[php] function __autoload($class_name) {
$file = ‘/classes/’.$class_name.’.php’;
if (file_exists($file)) require_once $file;
} [/php]

Si tiras de file_exists() y constantemente estás añadiendo y quitando clases quizás te resulta interesante usar clearstatcache() antes para limpiar la cache de estados de archivo.

Como es necesario definir el autoload al principio de cada script resulta útil usar la directiva auto_prepend_file, si no tienes acceso a tu PHP.INI puedes añadir lo siguiente en tu .htaccess:

php_value auto_prepend_file "funcion_autoload.php"

Una última consideración es que en teoría no se pueden lanzar exceptions desde dentro de la función __autoload(), aunque usando eval() para cargar la definición de la clase exception deseada lo puedes conseguir (en las notas del manual tienes varios ejemplos).

Tagged with:
preload preload preload