Beta, como Goooogle
11 Ene
En un artículo anterior comentaba sobre el uso de APC para optimizar el rendimiento de los scripts PHP, de forma totalmente automática, sin modificar la programación. En ese caso APC se encargaba de almacenar una copia del bytecode de PHP para que en la próxima ejecución no fuese necesario interpretar de nuevo el código fuente.
Pero esa no es la única utilidad de APC, también se puede utilizar para almacenar en memoria por un tiempo determinado los datos que el programador desee. Este sistema es ideal para aplicaciones con mucha carga de base de datos ya que permite almacenar ciertos datos en memoria y aliviar la base de datos del sistema y por lo tanto, el disco duro (suponiendo que todos los servicios estén en la misma máquina).
Una vez instalado APC, tal como se explica en este otro artículo, el uso de la cache de usuario es extremadamente sencillo, básicamente hay que tener en cuenta dos funciones, apc_store y apc_fetch.
La función apc_store se encarga de almacenar datos en una determinada clave. Por ejemplo:
$datos = 5;
apc_store(‘datos’,$datos,86400);
Así de sencillo, con esa instrucción los datos quedarán guardados en memoria. El primer argumento es la clave que sirve para identificar los datos guardados y poder recuperarlos más tarde. El segundo parámetro son los valores que queremos guardar, ese parámetro puede ser cualquier variable PHP, desde enteros hasta arrays y objetos. El tercer argumento es el tiempo en segundos que APC mantendrá los datos en memoria. Superado ese tiempo los datos serán automáticamente borrados de la cache.
Ahora que los datos están en memoria, queda saber cómo recuperarlos. Es más sencillo todavía, se usa la función apc_fetch:
$datos = apc_fetch(‘datos’);
A la función apc_fetch simplemente hay que pasarle la clave de los datos que queremos recuperar. Si no ha encontrado los datos devolverá “false”.
Esto puede usarse para almacenar los resultados de consultas que sean pesadas y evitar que se ejecuten una y otra vez si no es necesario. Por ejemplo, vamos a suponer que la tabla “posts” es muy grande y cuesta mucho ordenarla y filtrarla:
$posts = apc_fetch(‘posts-2010-ene-11′); // Se busca el contenido en la cache
if(!$posts) {
// Si el contenido no existe, se genera de nuevo
$posts = array();
$result = mysql_query(“SELECT * FROM posts WHERE fecha = ‘2010-01-11′ ORDER BY titulo”);
while($row = mysql_fetch_assoc($result)) $posts[] = $row;
apc_store(‘posts-2010-ene-11′,$posts,300); // Se guardan los posts en la cache durante 5 minutos
}
Eso es todo, el uso de la cache de usuario de APC es muy sencillo. Hay algunas otras funciones que se pueden ver desde http://php.net/apc
También es interesante revisar el fichero apc.php para saber cómo está trabajando la cache.
16 Dic
En MySQL cuando se realiza un operación INSERT el gestor de bases de datos realiza la inserción del registro que se le haya indicado y además devuelve la id del registro si se está trabajando con una tabla que tiene un campo auto_increment. Esta operación, para mantener la consistencia y además poder ofrecer la última id, se queda en espera hasta que MySQL haya acabado de realizar la inserción.
mysql_query(“INSERT INTO usuarios (usuario,historial) VALUES (5,’Lorem ipsum….’)”);
// PHP espera. El resto del código no se ejecutará hasta que no termine la operación
En muchos casos esto es lo ideal, ya que se suele necesitar la id que devuelve la inserción o también es posible que después de ese insert sea necesario realizar más operaciones que dependan de ese INSERT.
Pero en otros casos no es necesario para seguir trabajando ni la id que devuelve la inserción ni los querys siguientes dependen del último INSERT, en esos casos lo que premia es la velocidad, lanzar la instrucción de inserción y seguir trabajando sin esperar a que finalice. Para eso se puede usar INSERT DELAYED, la instrucción es completamente igual que un INSERT tradicional pero añadiendo la palabra clave “DELAYED”. Por ejemplo:
mysql_query(“INSERT DELAYED INTO usuarios (usuario,historial) VALUES (5,’Lorem ipsum….’)”);
// PHP no espera. El código que haya a continuación se ejecuta sin esperar a que MySQL termine
Es muy útil si en un script o aplicación (sea PHP, Python, Ruby, C o cualquier otro) necesitas insertar cientos o miles de registros sin que se quede bloqueada la aplicación esperando la inserción de cada uno de los registros. Mediante INSERT DELAYED la aplicación manda la instrucción a MySQL y éste ya se encargará de insertar los registros en la base de datos en el mejor momento. También es muy útil en servidores con mucha carga, ya que de esta manera MySQL busca el mejor momento para realizar los inserts y no justo cuando se hace la petición.
NOTA: Sólo funciona en tablas MyISAM y MEMORY. No funciona en otros motores como por ejemplo InnoDB.