3

我正在使用 Laravel 4 框架开发我的第一个应用程序(顺便说一句,使用它进行设计是一种乐趣)。对于一个组件,有一个 AJAX 请求来查询外部服务器。问题是,我只想在成功的情况下将这些响应缓存一段时间。

Laravel 有 Cache::remember() 功能,但问题是似乎没有“失败”模式(至少,在他们的文档中没有描述)不会存储缓存。

例如,采用这个简化的函数:

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

我想在这个输出上使用 Cache::remember ,但前提没有抛出异常。我可以想出一些不太优雅的方法来做到这一点,但我认为 Laravel 作为一个……雄辩的……框架,会有更好的方法。有什么帮助吗?谢谢!

4

3 回答 3

3

这对我有用:

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

于 2014-09-09T15:57:27.930 回答
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来操作数据库。

快乐编码!

于 2013-07-09T13:38:01.057 回答
0

我们正在通过将最后一个好的值存储在Cache::forever(). 如果缓存更新回调中有错误,我们只需将最后一个值从永久键中提取出来。如果成功,我们更新永久密钥。

于 2014-03-07T10:47:46.310 回答