Я разрабатываю одно из своих первых приложений с каркасом Laravel 4 (что, кстати, радует дизайн). Для одного компонента существует запрос AJAX для запроса внешнего сервера. Проблема в том, что я хочу кэшировать эти ответы в течение определенного периода времени, только если они успешны .
У Laravel есть функция Cache :: remember (), но проблема в том, что, похоже, нет «неудачного» режима (по крайней мере, ни один из них не описан в их документации), где кеш не будет храниться.
Например, возьмите эту упрощенную функцию:
try { $server->query(); } catch (Exception $e) { return Response::json('error', 400); }
Я хотел бы использовать Cache :: запомнить на выходе этого, но только если не было исключено Exception. Я могу придумать несколько менее элегантных способов сделать это, но я бы подумал, что Laravel, будучи таким … красноречивым … фреймворком, будет лучше. Любая помощь? Благодаря!
Я нашел этот вопрос, потому что я искал ответ на эту тему.
Между тем я нашел решение и хотел бы поделиться им здесь:
(также проверьте пример 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; }
Я рекомендую вам использовать Larvel's Eloquent ORM и / или Query Builder для работы с базой данных.
Счастливое кодирование!
Это то, что сработало для меня:
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
Мы работаем над этим, сохраняя последнее хорошее значение в Cache::forever()
. Если в обратном вызове обновления кеша есть ошибка, мы просто вытаскиваем последнее значение из вечного ключа. Если это будет успешным, мы обновим вечный ключ.