使用PHP cURL缓存

时间:2011-02-12 13:59:44

标签: php caching curl

我正在使用PHP cURL从其他网站获取信息并将其插入我的页面。我想知道是否有可能将获取的信息缓存在我的服务器上?例如,当访问者请求页面时,信息将被提取并缓存在我的服务器上24小时。然后该页面在本地完全服务24小时。当24小时过期时,当另一位访问者以同样的方式请求时,将再次获取和缓存该信息。

我目前用于获取信息的代码如下:

$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;

这可能吗?感谢。

6 个答案:

答案 0 :(得分:7)

您需要编写或下载php缓存库(如extensible php caching library等)并调整当前代码以首先查看缓存。

假设你的缓存库有2个函数叫做:

save_cache($result, $cache_key, $timestamp)

get_cache($cache_key, $timestamp)

使用save_cache(),您将$ result保存到缓存中,使用get_cache(),您将检索数据。

$cache_key将是md5($fullURL),是缓存库的唯一标识符,用于了解您要检索的内容。

$timestamp是您希望缓存有效的分钟/小时数,具体取决于您的缓存库接受的内容。

现在你的代码可以有一个逻辑:

$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;

答案 1 :(得分:3)

您可以使用memcache(会话)缓存它,您可以使用服务器上的文件缓存它,并且可以使用数据库缓存它,例如mySQL。

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

您需要设置要将文件写入的文件夹的权限,否则可能会出现一些错误。

然后,如果你想从缓存中读取:

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

答案 2 :(得分:1)

使用Nette Cache。所有你需要的解决方案,简单易用,当然 - 线程安全。

答案 3 :(得分:1)

Honza建议使用Nette cache对我来说很有用,这是我编写的使用它的代码。如果有效,我的函数返回HTTP结果,否则返回false。你必须改变一些路径字符串。

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;
}

答案 4 :(得分:0)

如果您对文件系统访问没有任何帮助,您可以将其存储在文件中。然后可以在服务器上使用一个脚本来检查文件的时间戳与当前时间,如果它太旧则删除它。

如果您无法访问服务器的所有方面,您可以使用上述想法并在信息中存储时间戳。每次请求页面时都要检查时间戳。

如果您遇到fs瓶颈问题,可以使用完全存储在RAM中的MySQL数据库。

答案 5 :(得分:-3)

避免缓存的最佳方法是将时间或任何其他随机元素应用于网址,如下所示:
$url .= '?ts=' . time();

所以例如而不是有 http://example.com/content.php
你会有 http://example.com/content.php?ts=1212434353