Laravel 圖片快取套件:Intervention/imagecache

Laravel 圖片快取套件:Intervention/imagecache

Laravel 圖片快取套件:Intervention/imagecache, Intervention/image是一個相當知名的PHP圖片處理套件,你可以用Composer安裝並單獨的使用在PHP專案中,官網也提供了支援Laravel的作法。而他也提供了一套緩存(Cache)的作法使用。

若你對Cache不熟悉,筆者這邊簡單的帶過一下,已經知道的可以跳過。

快取(Cache)或是緩存(大陸翻譯),可以擷取網站內的資料結果,如大型的搜尋結果,圖片, API呼叫等,而不需要重新去資料庫內搜索,可以節省網站的流量及提高網站的效能。 Cache和 Session 的結構很像,都是一個鍵值的配對;和 Session不同的是,Cache是針對整個網站應用程式,而Cache則是針對每一個用戶儲存的資訊。在Laravel 中有針對 Cache的組態設置config/cache.php,你可以在此處理組態設定的細節。Laravel預設是使用file作為快取,路徑在storage/framework/data,你也可以使用像是 Mamcached , Redis, APC或是資料庫系統。

安裝

composer require intervention/imagecache

加入到config/app.php

'providers' => array(
    
    [...]

    'Intervention\Image\ImageServiceProvider'
),
//....
'aliases' => array(
    
    [...]

    'Image' => 'Intervention\Image\Facades\Image'
),

使用

使用也相當簡單,基本上就一個:

$img = Image::cache(function($image) {
   return $image->make('YOUR_IMAGE_PATH')->resize($WIDTH, $height)(...ANOTHER_MODIFY_METHODS);
}, 10, true);
//第二個參數為cache的時間
//第三個參數為是否回傳物件,true回傳物件,false回傳stream

實際使用

這邊假設應用程式內全部的圖片我都要使用到cache。

若你有使用Intervention/image的話,照筆者的習慣,會用一個controller去處理他。

ImageController

<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Image;
use Storage;

class ImageController extends Controller
{
    public function render($dir, $filename)
    {
        return Image::cache(function ($image) use ($dir, $filename) {
                $contents = Storage::get($dir . '/' . $filename);
                $image->make($contents)->fit(PIC_WIDTH, PIC_HEIGHT);
            },null, true)->response();
    }
 }

然後另外開個Middleware 來處理

<?php
 
 namespace App\Http\Middleware;
 
 use Closure;
 
 class CachingMiddleware
 {
     /**
      * Handle an incoming request.
      *
      * @param  \Illuminate\Http\Request  $request
      * @param  \Closure  $next
      * @return mixed
      */
     public function handle($request, Closure $next)
     {
         $response = $next($request);
         $response->header('Cache-Control', 'max-age=31536000, public'); // 設置標頭,max-age可以填入時間,單位為秒
         return $response;
     }
 }

接著在app/Http/Kernel引入

//...
protected $routeMiddleware = [
//...
         'cache' => \App\Http\Middleware\CachingMiddleware::class,
     ];

最後因為圖片都要經過cache所以在ImageController內加入__construct()

ImageController extends Controller
{
  public function __construct()
  {
    $this->middleware('cache');
  }
}

基本上到這邊就完成圖片的Cache。

結果

可以打開瀏覽器(這邊假設你用Chrome),打開『檢查』功能,到Network(若Disable cache 有開記得關掉!)應該可以看到圖片的size欄位是from memory,且點進去後也會發現 Response Header內的Cache-Control會是我們預設的值:'max-age=31536000, public',那就恭喜你完成了圖片的快取!