2011-02-12 25 views
9

Estoy usando PHP cURL para obtener información de otro sitio web e insertarla en mi página. Me preguntaba si era posible tener la información obtenida en caché en mi servidor. Por ejemplo, cuando un visitante solicita una página, la información se busca y almacena en caché en mi servidor durante 24 horas. La página se sirve enteramente localmente durante 24 horas. Cuando caducan las 24 horas, la información vuelve a ser captada y almacenada en caché cuando otro visitante la solicita, de la misma manera.Caché usando PHP cURL

El código que estoy usando actualmente en busca de la información es la siguiente:

$url = $fullURL; 
$ch = curl_init();  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 

Es esto posible? Gracias.

Respuesta

7

Necesita escribir o descargar una biblioteca de caché de php (como extensible php caching library o similar) y ajustar su código actual para echar un vistazo primero a la memoria caché.

Digamos que su biblioteca de caché ha llamado 2 funciones:

save_cache($result, $cache_key, $timestamp) 

y

get_cache($cache_key, $timestamp) 

Con save_cache() le ahorrará el resultado $ en la memoria caché y con get_cache() se va a recuperar los datos.

$cache_key sería md5($fullURL), un identificador único para la biblioteca de almacenamiento en caché para saber lo que desea recuperar.

$timestamp es la cantidad de minutos/horas que desea que la memoria caché sea válida, dependiendo de lo que acepte su biblioteca de almacenamiento en caché.

Ahora en su código que puede tener una lógica como:

$cache_key = md5($fullURL); 
$timestamp = 24 // assuming your caching library accept hours as timestamp 

$result = get_cache($cache_key, $timestamp); 
if(!result){ 
    echo "This url is NOT cached, let's get it and cache it"; 
    // do the curl and get $result 
    // save the cache: 
    save_cache($result, $cache_key, $timestamp); 
} 
else { 
    echo "This url is cached"; 
} 
echo $result; 
+2

Oye, gracias por la lógica. Al final, descargué la biblioteca pear cache_lite y parece que funciona sin problemas. Aclamaciones. – Matt

+1

Si almacena en caché el contenido costoso, considere buscar nuevo contenido antes de invalidar el que está en caché (para que no perjudique a su servidor cuando 300 visitas al mismo tiempo intenten buscar la nueva versión). Solo sirve la versión anterior mientras se descarga la nueva. Lo mismo se aplica a las consultas SQL en caché. – Marki555

3

Puede almacenarlo en caché utilizando memcache (una sesión) puede almacenarlo en caché utilizando archivos en su servidor y puede almacenarlo en caché utilizando una base de datos, como mySQL.

file_put_contents("cache/cachedata.txt",$data); 

Usted tendrá que configurar los permisos de la carpeta que desea escribir los archivos a, de lo contrario podría obtener algunos errores.

Entonces, si usted desea leer de la caché:

if(file_exists("cache/cachedata.txt")) 
{ $data = file_get_contents("cache/cachedate.txt"); } 
else 
{ // curl here, we have no cache 
} 
+0

Gracias por la respuesta. – Matt

0

Si usted no tiene nada en contra de acceso al sistema de archivos, sólo puede almacenar en un archivo. Luego, tal vez use una secuencia de comandos en el servidor que verifique la marca de tiempo del archivo con la hora actual y la elimine si es demasiado antigua.

Si no tiene acceso a todos los aspectos del servidor, puede utilizar la idea anterior y almacenar una marca de tiempo con la información. Cada vez que se solicita la página, compruebe en contra de la marca de tiempo.

Y si tiene problemas con el cuello de botella fs, puede utilizar una base de datos MySQL almacenada por completo en la memoria RAM.

1

Uso Nette Cache. Todo lo que necesita es una solución, fácil de usar y, por supuesto, seguro para subprocesos.

-3

La mejor manera de evitar el almacenamiento en caché está aplicando el tiempo o cualquier otro elemento aleatorio a la URL, por ejemplo:
$url .= '?ts=' . time();

así por ejemplo en vez de tener
http://example.com/content.php
que tendría
http://example.com/content.php?ts=1212434353

1

La sugerencia de Honza de usar Nette cache me funcionó muy bien, y aquí está el código que escribí para usarlo. Mi función devuelve el resultado HTTP si funcionó, falso si no. Tendrá que cambiar algunas cadenas de ruta.

use Nette\Caching\Cache; 
use Nette\Caching\Storages\FileStorage; 
Require("/Nette/loader.php"); 

function cached_httpGet($url) { 
    $storage = new FileStorage("/nette-cache"); 
    $cache = new Cache($storage); 
    $result = $cache->load($url); 
    if ($result) { 
     echo "Cached: $url"; 
    } 
    else { 
     echo "Fetching: $url"; 
     $ch = curl_init();  
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     $result = curl_exec($ch); 
     if (curl_errno($ch)) { 
      echo "ERROR " . curl_error($ch) . " loading: $url"; 
      return false; 
     } else 
      $cache->save($url, $result, array(Cache::EXPIRE => '1 day')); 
     curl_close($ch); 
    } 
    return $result; 
}