Uso de Memcached para el almacenamiento en caché de datos PHP en ServBay
ServBay, como un potente entorno local de desarrollo web, viene con el paquete de software Memcached (servidor Memcached) de alto rendimiento preinstalado, así como la extensión PHP correspondiente, lo que facilita a los desarrolladores implementar un almacenamiento en caché de datos eficiente en sus aplicaciones PHP y mejorar significativamente el rendimiento.
En este artículo, se explica en detalle cómo verificar y utilizar Memcached y su extensión PHP asociada en ServBay.
Introducción a Memcached
Memcached es un sistema de almacenamiento en caché de objetos en memoria, distribuido y de alto rendimiento. Al almacenar datos temporalmente en la memoria (como resultados de consultas a bases de datos, respuestas de llamadas API, fragmentos de página, etc.), reduce la frecuencia de acceso a los sistemas de almacenamiento backend (como bases de datos), acelerando así la velocidad de respuesta y el rendimiento de aplicaciones web dinámicas.
Principales características
- Alto rendimiento: Los datos se almacenan en memoria, lo que proporciona velocidades de lectura y escritura extremadamente rápidas.
- Distribuido: Soporta la creación de pools de caché distribuidos entre múltiples servidores, facilitando la escalabilidad.
- Simple y fácil de usar: Protocolo sencillo, amplias librerías cliente y fácil integración.
- Reducción de la carga en la base de datos: Disminuye de manera efectiva la presión sobre la base de datos, especialmente en escenarios de alta concurrencia.
Diferencias entre las extensiones PHP memcache
y memcached
En PHP existen dos extensiones comunes para conectarse a servidores Memcached: memcache
y memcached
. Aunque sus nombres son similares, se trata de dos extensiones diferentes que ofrecen APIs y funciones distintas:
- Extensión
memcache
:- Fue la primera extensión PHP para este propósito.
- Proporciona principalmente una API de estilo procedural (
memcache_connect()
,memcache_set()
, etc.). - Sus funcionalidades son más básicas y no soporta algunas características avanzadas como hashing consistente (aunque algunos clientes lo implementan).
- Extensión
memcached
:- Es una extensión más reciente (respaldada por la biblioteca libmemcached).
- Ofrece una API orientada a objetos (clase
Memcached
). - Soporta más funciones avanzadas como hashing consistente, protocolo binario, autenticación SASL, opciones de serialización flexibles, entre otras.
- Generalmente se recomienda utilizar la extensión
memcached
ya que es más potente y está mejor mantenida.
Por defecto, ServBay proporciona y recomienda usar la extensión PHP memcached
, que es más completa.
Paquete Memcached y extensión PHP en ServBay
ServBay no solo integra el servidor Memcached como un paquete fácilmente gestionable, sino que también ha preinstalado y habilitado por defecto la extensión PHP memcached
en todas las versiones de PHP integradas.
Esto significa que, en la mayoría de los casos, después de instalar ServBay, tanto el servidor Memcached como la extensión PHP están listos para usarse, sin necesidad de compilar o configurar PHP adicionalmente.
Cómo comprobar el estado del paquete Memcached:
Puedes encontrar el paquete Memcached
en la interfaz principal de ServBay o en la sección de gestión de paquetes y asegurarte de que está en estado “En ejecución”. Si no está funcionando, intenta iniciarlo.
Verificar que la extensión PHP memcached
está cargada:
Para confirmar si la extensión memcached
está cargada en una versión PHP específica, la forma más sencilla es usar la función phpinfo()
:
En el directorio raíz de tu sitio en ServBay (por defecto
/Applications/ServBay/www
), crea un archivo PHP nuevo, por ejemploinfo.php
.Añade el siguiente contenido en el archivo:
php<?php phpinfo(); ?>
1
2
3Accede a este archivo a través de tu sitio local configurado en ServBay (por ejemplo, si tu dominio es
servbay.demo
, ingresa ahttp://servbay.demo/info.php
).En la página que se abre de
phpinfo
, busca la sección "memcached". Si aparece una sección con ese nombre donde se muestra información de configuración y la versión, significa que la extensión ha sido cargada correctamente y está disponible.
Uso de Memcached en código PHP
Una vez hayas confirmado que el servidor Memcached está en ejecución y que la extensión PHP memcached
está cargada, puedes usar la clase Memcached
en tus aplicaciones PHP para conectar al servidor y realizar operaciones de almacenamiento en caché.
Por defecto, el servidor Memcached está disponible en localhost
en el puerto estándar 11211
.
Ejemplo de código
A continuación, se muestra un ejemplo sencillo de código PHP que utiliza la clase Memcached
para conectarse al servidor Memcached local y realizar operaciones de establecimiento y obtención de datos:
Guarda el siguiente código como un archivo PHP en el directorio de tu sitio en ServBay (por ejemplo, /Applications/ServBay/www/memcached_test.php
):
php
<?php
// Información del servidor Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Crear instancia del cliente Memcached
$memcached = new Memcached();
// Agregar el servidor Memcached al pool de conexiones del cliente
// El método addServer() devuelve un valor booleano que indica si se agregó correctamente a la lista, no si la conexión fue exitosa
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Nota: el fallo de addServer suele deberse a la configuración, no necesariamente a que el servidor esté inaccesible
die("No se pudo agregar el servidor Memcached a la lista de conexiones del cliente. Verifica la configuración de host y puerto.");
}
// Intentar obtener una clave inexistente para probar la conexión (opcional pero recomendado)
// get() devuelve false o un array vacío si la clave no existe o si hubo un problema de conexión
// Memcached::getResultCode() permite obtener un código de estado más específico
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Intentar obtener una clave que no existe
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Si no es RES_NOTFOUND ni RES_SUCCESS, puede indicar un problema de conexión
// Nota: RES_SUCCESS también puede devolverse si se obtiene un valor vacío
// Una comprobación de conexión más rigurosa puede requerir lógica adicional o depender del comportamiento del cliente
// Para desarrollo local, normalmente basta con que addServer tenga éxito y no haya errores en las operaciones posteriores
echo "Atención: Puede haber un problema al conectar con el servidor Memcached. Código de resultado: " . $result_code . "<br>";
// En entornos productivos, puede ser necesario manejar los errores de manera más exhaustiva
} else {
echo "Conexión exitosa al servidor Memcached ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Ejemplo de operaciones de caché ---
// Datos a almacenar en caché
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // Tiempo de expiración de la caché en segundos (aquí, 1 hora)
// Guardar datos en caché
// El método set() devuelve un valor booleano que indica si la operación fue exitosa
if ($memcached->set($key, $data, $expiration)) {
echo "Datos almacenados exitosamente en Memcached, clave '{$key}', expiración en {$expiration} segundos.<br>";
} else {
echo "¡Error al guardar los datos en caché!<br>";
// Puedes usar $memcached->getResultCode() para conocer la razón del fallo
echo "Código de resultado: " . $memcached->getResultCode() . "<br>";
}
// Intentar recuperar datos almacenados en caché
echo "Intentando recuperar datos desde la caché...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() devuelve false si la clave no existe o si ocurre un fallo
echo "Datos recuperados exitosamente de la caché:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Caché no encontrada o error al recuperar datos, clave '{$key}'.<br>";
echo "Código de resultado: " . $memcached->getResultCode() . "<br>";
}
// Simulación de la expiración de la caché (asumiendo que transcurre tiempo)
// Normalmente, en una aplicación real, debes comprobar si $cachedData es false. Si es así, cargar los datos desde la fuente original (como la base de datos) y almacenarlos nuevamente en la caché.
// Ejemplo: eliminar datos de la caché
/*
echo "Intentando eliminar los datos de la caché...<br>";
if ($memcached->delete($key)) {
echo "Datos eliminados exitosamente de la caché, clave '{$key}'.<br>";
} else {
echo "¡Fallo al eliminar los datos de la caché!<br>";
echo "Código de resultado: " . $memcached->getResultCode() . "<br>";
}
// Intentar recuperar los datos ya eliminados
echo "Intentando nuevamente obtener los datos ya eliminados...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Datos encontrados (fallo al eliminar):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Los datos ya no están en caché (como se esperaba).<br>";
echo "Código de resultado: " . $memcached->getResultCode() . "<br>";
}
*/
// Ejemplo: vaciar toda la caché (¡usar con precaución!)
/*
echo "Intentando vaciar toda la caché...<br>";
if ($memcached->flush()) {
echo "Todos los datos de la caché han sido eliminados.<br>";
} else {
echo "¡Error al limpiar la caché!<br>";
echo "Código de resultado: " . $memcached->getResultCode() . "<br>";
}
*/
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Accede al archivo memcached_test.php
desde tu sitio local configurado con ServBay, y verás la salida del estado de la conexión, el almacenamiento y la recuperación de datos.
Consideraciones importantes
- Asegúrate de que el paquete Memcached en ServBay esté en estado En ejecución.
- Por defecto, Memcached escucha en
127.0.0.1
(olocalhost
) en el puerto11211
, normalmente no es necesario modificar esto. - Si la conexión desde PHP falla, revisa tanto el estado del paquete Memcached como la posibilidad de que un firewall esté bloqueando conexiones locales.
- El método
addServer
de la claseMemcached
únicamente añade el servidor al pool de servidores, pero no establece una conexión persistente ni verifica inmediatamente la disponibilidad. Las conexiones y operaciones reales se suceden al invocar métodos comoget
,set
, etc. Puedes comprobar el éxito de estas operaciones evaluando los valores de retorno o usandogetResultCode()
.
Resumen
ServBay ofrece a los desarrolladores una forma sumamente cómoda de utilizar Memcached. Gracias a la integración del servidor Memcached y la extensión PHP memcached
preinstalada y habilitada por defecto, no necesitas enfrentarte a procesos complejos de instalación y configuración. Así podrás aprovechar inmediatamente el almacenamiento en caché eficiente de Memcached en tu entorno de desarrollo local, sentando una base robusta para construir aplicaciones PHP de alto rendimiento.