2013-06-07 1 views
2

Laravel 4 프레임 워크로 디자인 한 기쁨이있는 첫 번째 응용 프로그램을 개발하고 있습니다. 하나의 구성 요소에는 외부 서버를 쿼리하는 AJAX 요청이 있습니다. 문제는 특정 시간 동안 이러한 응답을 캐시하려는 경우 성공한 경우에만입니다.Laravel Selective Caching

Laravel에는 Cache :: remember() 함수가 있지만 문제는 캐시가 저장되지 않는 "실패"모드 (적어도 설명서에는 설명되지 않음)가없는 것 같습니다.

try { 
    $server->query(); 
} catch (Exception $e) { 
    return Response::json('error', 400); 
} 

나는이의 출력에 기억 :: 캐시를 사용하고 싶습니다,하지만 예외는 를 발생하지 않은 경우 :

예를 들어,이 단순화 기능을. 나는 이것보다 약간 덜 우아한 방식을 생각할 수 있지만, Laravel이 그런 웅변적인 프레임 워크가되는 것이 더 좋은 방법이라고 생각할 것입니다. 어떤 도움이 필요합니까? 감사!

+1

어떤 약으로 사용할 수있는 '캐시 :()'은'차단 catch' 잊지? – Felix

답변

1

이 주제에 대한 답변을 찾고 있었기 때문에이 질문을 발견했습니다. 한편

나는 해결책을 발견하고 여기를 공유하고 :
당신이 Laravel의를 사용하는 것이 좋습니다

<?php 
/** 
* Caching the query - Example 1 
*/ 

function cacheQuery_v1($server) 
{ 
    // Set the time in minutes for the cache 
    $minutes = 10; 

    // Check if the query is cached 
    if (Cache::has('db_query')) 
    { 
     return Cache::get('db_query'); 
    } 

    // Else run the query and cache the data or return the 
    // error response if an exception was catched 
    try 
    { 
     $query = $server->query(...); 
    } 
    catch (Exception $e) 
    { 
     return Response::json('error', 400); 
    } 

    // Cache the query output 
    Cache::put('db_query', $query, $minutes); 

    return $query; 
} 


/** 
* Caching the query - Example 2 
*/ 

function cacheQuery_v2($server) 
{ 
    // Set the time in minutes for the cache 
    $minutes = 10; 

    // Try to get the cached data. Else run the query and cache the output. 
    $query = Cache::remember('db_query', $minutes, function() use ($server) { 
     return $server->query(...); 
    }); 

    // Check if the $query is NULL or returned output 
    if (empty($query)) 
    { 
     return Response::json('error', 400); 
    } 

    return $query; 
} 

(또한 코드의 추가에 대한 예 2를 확인) 데이터베이스와 함께 작동하려면 Eloquent ORM 및/또는 Query Builder.

해피 코딩!

0

우리는 Cache::forever()에 마지막으로 좋은 값을 저장하여이 문제를 해결하고 있습니다. 캐시 업데이트 콜백에 오류가 있으면 우리는 영원히 열쇠에서 마지막 값을 꺼냅니다. 성공하면 영원히 열쇠를 업데이트합니다.

1

이 나를 위해 일 것입니다 :

if (Cache::has($key)) { 
    $data = Cache::get($key); 
} else { 
    try { 
     $data = longQueryOrProcess($key); 
     Cache::forever($key, $data); // only stored when no error 
    } catch (Exception $e) { 
     // deal with error, nothing cached 
    } 
} 

물론 당신이 Cache::put($key, $data, $minutes); 대신 forever