我正在使用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;
这可能吗?感谢。
答案 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