2011-02-12 6 views
9

다른 웹 사이트에서 정보를 가져 와서 내 페이지에 삽입하려면 PHP cURL을 사용하고 있습니다. 가져온 정보를 내 서버에 캐시 할 수 있는지 궁금합니다. 예를 들어, 방문자가 페이지를 요청하면 정보가 내 서버에서 24 시간 동안 페치되고 캐시됩니다. 페이지는 24 시간 동안 전적으로 로컬로 제공됩니다. 24 시간이 만료되면 같은 방법으로 다른 방문자가 정보를 요청하면 정보를 다시 가져 와서 캐시합니다.PHP cURL을 사용하는 캐시

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

이게 가능 : 다음과 같이

나는 현재 정보를 가져 오기 위해 사용하고있는 코드는? 감사.

답변

7

PHP 캐싱 라이브러리 (예 : extensible php caching library 등)를 작성하거나 다운로드하고 현재 코드를 조정하여 캐시를 먼저 살펴야합니다.

의이 캐시 라이브러리가이 개 함수가 호출 한 가정 해 봅시다 : save_cache()

save_cache($result, $cache_key, $timestamp) 

get_cache($cache_key, $timestamp) 

당신이 캐시에 $ 결과를 저장하고 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; 
+2

안녕하세요, 논리에 감사드립니다. 결국 나는 배 cache_lite 라이브러리를 다운로드하고 이것은 원활하게 작동하는 것 같습니다. 건배. – Matt

+1

시간이 많이 소요되는 콘텐츠를 캐싱하는 경우 캐시에서 콘텐츠를 무효화하기 전에 새로운 콘텐츠를 가져 오는 것이 좋습니다 (동시에 300 회의 방문을 통해 새 버전을 가져 오는 경우 서버가 손상되지 않습니다). 새 버전이 다운로드되는 동안 이전 버전을 제공하십시오. 동일한 내용이 캐시 된 SQL 조회에도 적용됩니다. – Marki555

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 
} 
+0

답변 해 주셔서 감사합니다. – Matt

0

, 당신은 단지 파일에 저장할 수 있습니다. 그런 다음 서버의 스크립트를 사용하여 파일의 타임 스탬프를 현재 시간과 비교하고 너무 오래되면 삭제합니다.

서버의 모든 측면에 액세스 할 수 없다면 위의 아이디어를 사용하고 정보와 함께 타임 스탬프를 저장할 수 있습니다. 페이지가 요청 될 때마다 타임 스탬프를 확인하십시오.

fs 병목 현상에 문제가있는 경우 전체적으로 RAM에 저장된 MySQL 데이터베이스를 사용할 수 있습니다.

1

사용 Nette Cache :

지금 당신의 코드는 같은 논리를 가질 수있다. 솔루션을 사용하고 사용하기 쉽고 물론 스레드 안전성이 필요한 모든 것.

-3

캐싱을 방지하는 가장 좋은 방법은 다음과 같이 시간이나 URL에 다른 임의의 요소를 적용한다 : 예를 들어 너무
$url .= '?ts=' . time();

대신
http://example.com/content.php
을 가진 당신이
http://example.com/content.php?ts=1212434353있을 것입니다

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; 
} 
관련 문제