2015-03-26 30 views
6

Đồng nghiệp PHP:Laravel Cache :: Các phương pháp hay nhất

Câu hỏi này liên quan đến các phương pháp hay nhất để sử dụng Laravel Cache.

Mục tiêu trung tâm là giảm số lượng quyền truy cập vào cơ sở dữ liệu cho tất cả các lý do liên quan đến hiệu suất thông thường. Ứng dụng này là một trang web tin tức chuyên sâu có thể đọc được với hàng tá bộ điều khiển nhiều nhất, chủ yếu là loại tài nguyên.

Có bất kỳ phương pháp hay nhất được ghi lại nào về thiết kế ứng dụng không? Có vẻ như rõ ràng với tôi vì Cache :: là một câu lệnh một dòng, nên dễ dàng thả điều này vào bộ điều khiển - hoặc trả về dữ liệu được lưu trong bộ nhớ cache hoặc gọi mô hình và lưu vào bộ nhớ cache kết quả. Và vô hiệu hóa bộ nhớ cache (có thể với tải lại mong muốn) khi yêu cầu cập nhật mô hình. Nhưng đó là một thực hành tốt?

Dưới đây là một cái nhìn đầu tiên tại làm điều này trong bộ điều khiển

/** 
* Retrieve listing of the gallery resource. 
* 
* @uses GET /gallery to return all image_collections. 
* 
* @param int $id The gallery id 
* 
* @return Response - Contains a HTTP code and a list of articles. 
*/ 
public function index() 
{ 
    $response_data = array(); 
    $response_code = 200; 

    // TRY TO RETURN A CACHED RESPONSE 
    $cache_key = "gallery_index"; 
    $response_data = Cache::get($cache_key, null); 

    // IF NO CACHED RESPONSE, QUERY THE DATABASE 
    if (!$response_data) { 
     try { 
      $response_data['items'] = $this->gallery->all(); 
      Cache::put($cache_key, $response_data, Config::get('app.gallery_cache_minutes')); 
     } catch (PDOException $ex) { 
      $response_code = 500; 
      $response_data['error'] = ErrorReporter::raiseError($ex->getCode()); 
     } 
    } 

    return Response::json($response_data, $response_code); 
} 

Tôi đã nghe những gợi ý mà bạn có thể sử dụng bộ lọc Laravel Hướng đến bộ nhớ cache các câu trả lời, nhưng tôi có thể không hoàn toàn được đầu của tôi xung quanh Ý tưởng.

Suy nghĩ? Tài liệu tham khảo? Ví dụ?

Nhờ tất cả, Ray

+0

Quản lý bộ nhớ cache khó, tất cả phụ thuộc vào những gì bạn đang lưu vào bộ nhớ cache. Nếu bạn đang trình bày giá trị gần đúng, bạn có thể không quan tâm nếu dữ liệu cơ bản hơi lỗi thời, ngược lại nếu bạn đang lưu vào bộ nhớ cache như ALC, nó có thể luôn đúng (và sau đó được flushed khi lưu trữ dữ liệu bên dưới) . – Matthew

+0

Bạn nên tách logic của bạn trong bộ điều khiển, ví dụ bạn có thể chuyển bộ nhớ cache kiểu gợi ý đến bộ dựng điều khiển của bạn, tôi cũng khuyên bạn nên tạo kho lưu trữ cho bộ nhớ đệm của bạn, vì vậy bạn có thể tận dụng khả năng bộ nhớ đệm của Laravel. – Darick

Trả lời

12

Nhiều người làm việc này khác nhau nhưng khi thực hành tốt nhất là mối quan tâm tôi tin rằng nơi tốt nhất để làm bộ nhớ đệm là trong kho của bạn.

Bộ điều khiển của bạn không nên biết quá nhiều về nguồn dữ liệu mà tôi muốn nói là nó đến từ bộ nhớ cache hoặc đến từ cơ sở dữ liệu hay không.

Caching trong bộ điều khiển không hỗ trợ phương pháp DRY (Don't Repeat Yourself), vì bạn thấy mình sao chép mã của bạn trong một số bộ điều khiển và phương pháp do đó làm cho các tập lệnh khó duy trì.

Vì vậy, đối với tôi đây là cách tôi cuộn trong Laravel 5 không quá khác biệt nếu đang sử dụng laravel 4:

// 1. Tạo thư việnEloquentRepository.php trong App/Repositories

<?php namespace App\Repositories; 

use App\Models\Gallery; 
use \Cache; 

/** 
* Class GalleryEloquentRepository 
* @package App\Repositories 
*/ 
class GalleryEloquentRepository implements GalleryRepositoryInterface 
{ 

    public function all() 
    { 
     return Cache::remember('gallerys', $minutes='60', function() 
     { 
      return Gallery::all(); 
     }); 
    } 


    public function find($id) 
    { 
     return Cache::remember("gallerys.{$id}", $minutes='60', function() use($id) 
     { 
      if(Cache::has('gallerys')) return Cache::has('gallerys')->find($id); //here am simply trying Laravel Collection method -find 

      return Gallery::find($id); 
     }); 
    } 

} 

// 2. Tạo GalleryRepositoryInterface.php trong App/Repositories

<?php namespace App\Repositories; 

/** 
* Interface GalleryRepositoryInterface 
* @package App\Repositories 
*/ 
interface GalleryRepositoryInterface 
{ 

    public function find($id); 

    public function all(); 
} 

// 3. Tạo RepositoryServiceProvider.php trong App/Providers

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

/** 
* Class RepositoryServiceProvider 
* @package App\Providers 
*/ 
class RepositoryServiceProvider extends ServiceProvider 
{ 

    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    //protected $defer = true; 

    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 

     $this->app->bind(
      'App\Repositories\GalleryRepositoryInterface', 
      'App\Repositories\GalleryEloquentRepository' 
     ); 
    } 
} 

// 4. Tại bộ điều khiển, bạn có thể thực hiện điều này

<?php namespace App\Http\Controllers; 

use \View; 
use App\Repositories\GalleryRepositoryInterface; 

class GalleryController extends Controller { 

    public function __construct(GalleryRepositoryInterface $galleryInterface) 
    { 
     $this->galleryInterface = $galleryInterface; 

    } 


    public function index() 
    { 
     $gallery = $this->galleryInterface->all(); 

     return $gallery ? Response::json($gallery->toArray()) : Response::json($gallery,500); 
    } 

} 
+1

Câu trả lời hay, @Digilimit. –

+0

Vì vậy, không phải trong các mô hình? – rjksn

+0

Mô hình cũng là một nơi tốt nhưng chúng ta không nên qua mô hình đám đông với nhiều mã. – Digitlimit

Các vấn đề liên quan