2013-06-07 4 views
2

Я разрабатываю одно из своих первых приложений с каркасом Laravel 4 (что, кстати, радует дизайн). Для одного компонента существует запрос AJAX для запроса внешнего сервера. Проблема в том, что я хочу кэшировать эти ответы в течение определенного периода времени , только если они успешны.Laravel Селективное кэширование

У Laravel есть функция Cache :: remember(), но проблема в том, что, похоже, нет «отказавшего» режима (по крайней мере, ни один из них не описан в их документации), где кеш не будет храниться.

Например, возьмем эту упрощенную функцию:

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

Я хотел бы использовать Cache :: помните о выходе, но не только, если не было сгенерировано исключение. Я могу придумать несколько менее элегантных способов сделать это, но я бы подумал, что Laravel, будучи таким ... красноречивым ... фреймворком, будет лучше. Любая помощь? Благодаря!

+1

Что о 'Cache :: забыть()' в 'catch' блок? – Felix

ответ

1

Я нашел этот вопрос, потому что искал ответ об этой теме.

В то же время я нашел решение и хотел бы поделиться им здесь:
(также проверить пример 2 далее в коде)

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

Я рекомендую вам использовать Laravel-х 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

Смежные вопросы