Nunca antes había almacenado datos en caché, pero siento que mejorará enormemente mi sitio.

Básicamente, extraigo datos JSON de una API externa que ayuda a la funcionalidad básica de mi sitio web. Esta información realmente no cambia tan a menudo, pero mis usuarios obtienen la información de la API miles de veces al día. Si se actualiza una vez al día, estaría bien. Quiero ejecutar un trabajo cron diariamente que extraiga la información y actualice el caché.

Ya probé algunas cosas diferentes, ambas usando PHP:

1) Almacenar datos en una tabla SQL
Lo tenía funcionando, pero no hay ninguna razón por la que deba hacer ping a la base de datos cada vez que pueda almacenarla en HTML / JSON básico.

2) archivo .JSON (usando fwrite)
Lo tenía almacenado, pero la única forma en que esto funcionó es si la función de devolución de llamada .getJSON() se antepone a los datos JSON y luego los datos están rodeados de paréntesis (lo que creo que es jsonp).

¿Alguien tiene algún consejo o instrucciones para guiarme? Como dije, nunca he hecho algo así, así que ni siquiera sé si me dirijo remotamente en la dirección correcta.

Editar:

Bien, entonces hablé con mi hosting y como estoy en un hosting compartido (dreamhost) no puedo instalar memcached, lo cual es una mierda. La única información que me pudieron dar fue que si está en http://pecl.php.net/ entonces Lo más probable es que pueda usarlo. Dijeron que APC está disponible. No estoy seguro de si esto se ajusta a mi problema. Me gustaría poder acceder al caché directamente en jQuery. Gracias

5
switz 22 jul. 2011 a las 22:59

6 respuestas

La mejor respuesta

Puedes usar memcached. Memcached es un almacén de valores clave en memoria para pequeños fragmentos de datos arbitrarios (cadenas, objetos) a partir de resultados de llamadas a bases de datos, llamadas a API o representación de páginas. Muy fácil de implementar y tiene una huella de sistema baja.

6
Chris Ledet 22 jul. 2011 a las 19:03

Si sus datos varían según el usuario:

Lo he hecho almacenando un objeto en la matriz $ _SESSION.

Adjunto un poco de lógica que determina si el período de caducidad de los datos ha finalizado. Si es así, extrae nuevos datos, sirve y almacena en caché. Si no, se basa en $ _SESSION y lo sirve.

0
Jonathan M 22 jul. 2011 a las 19:07

Pruebe con Redis. Y para almacenar datos fácilmente sin errores inesperados en set / get: codifíquelos con base64.

0
Nikolay Fominyh 22 jul. 2011 a las 19:33

Intente memcached. Puede generar fácilmente una clave de cadena y almacenar cualquier blob de json que desee con ella. funciona como un diccionario, excepto que persiste en la memoria.

Hay una opción para darle un tiempo de caducidad (de lo contrario, solo permanece en caché para siempre). Entonces, cuando el usuario solicita los datos, simplemente verifique si están almacenados en memcached. Si es así, genial, devuélvelo. Si no es así, haga lo que haga para construirlo, luego póngalo en la memoria caché con una caducidad de 24 horas.

1
Mike Ruhlin 22 jul. 2011 a las 19:08

Esto para almacenar:

file_put_contents($path, $json_text);

Y esto para restaurar:

$json_text = file_get_contents($path);
echo $json_text;

echo se puede usar para pasar el json exactamente como proviene de la solicitud http. si necesita analizarlo en una variable (en javascript) puede usar array = JSON.parse('<?php echo $json_text; ?>');. si necesita analizar en php, use $array = json_decode($json_text);.

0
Hugo Mota 22 jul. 2011 a las 19:54

Como no puede usar memcached, regrese a la opción de su base de datos y almacénela en una tabla usando MEMORIA motor.

2
Justin ᚅᚔᚈᚄᚒᚔ 22 jul. 2011 a las 23:02