2015-03-31 61 views
3

我正在使用Intervention/imagecache來緩存我的圖像。 但是,緩存圖像加載速度比源圖像文件慢。在時間latancy 幾乎額外60-70ms(測試在鉻檢查元件網絡)Laravel Image Cache比源緩慢

這是代碼我如何在Route.php

Route::get('images/cars/{src}', function ($src){  
     $cacheimage = Image::cache(function($image) use($src){ 
      return $image->make("images/products/".$src); 
     },1440); 

     return Response::make($cacheimage,200, array('Content-Type'=>'image/jpg')); 
    }); 

加載圖像在葉片

<img src="{{ URL::asset('/images/cars/theimage.jpg' }}" alt=""> 

任何想法或更好的方式來存儲圖像緩存?

+0

有關於它的https://github.com/Intervention/imagecache/issues/38 – 2015-03-31 09:51:21

+0

我在做一個評論GitHub上的問題還有 – Eric 2015-03-31 12:27:37

回答

6

我從來沒有使用laravel,但這是一個普遍問題。

如果你讓web服務器處理圖像傳遞到客戶端,PHP解釋器將不會啓動。

如果你通過PHP提供了一些東西(我假設,因爲你寫了一些關於緩存圖片的東西),你需要php解釋器。然後,您需要執行該腳本,並且其所有腳本語言的邏輯總是較慢,然後是本地腳本。

最好的辦法是,將圖像保存到文件系統中,並鏈接到它,而不是PHP腳本。

這意味着,例如:

某處在您的應用程序有一個點,在那裏創建了原始圖像。現在想想,你需要什麼版本。調整大小,裁剪,儘可能多地編輯它。將您需要的每個版本保存到您的文件系統中。所以你有,而不是image.jpg a image-200x200-cropped-with-branding.jpg。在這一點上,表現應該不那麼重要(該圖像將被觀看數千次,但只有一次創建)。

你想擁有的

<img src="/path/to/image-200x200-cropped-with-branding.jpg">; 

代替

<img src="/image.php?param1=1&param2=2">; 
+2

PHP解釋器是一回事,引導整個框架會讓它變得更糟...... – lukasgeiter 2015-03-31 10:12:52

+0

你說的話有點道理,好像我必須用不同的方法。 – Eric 2015-03-31 12:28:15

+1

我有同樣的問題。感謝@Christian您的解決方案爲我解決了這個問題。 +1爲你 – Digitlimit 2015-04-08 04:37:08

2

只是一些額外的想法,基於基督教Gollhardt的答案。

他是絕對正確的,這是一個普遍問題。但我不喜歡他創建原始圖像的創建(或上傳)所需的所有版本的方法。因爲存在一個大問題,如果 - 在將來的某個時間點 - 您認爲縮略圖應該是250x250而不是200x200(或任何其他維度)?所以基本上我想要的是ImageCache軟件包提供的靈活性,而不會影響性能。

我還沒有真正實現過這一點,但我的方法是使用某種輔助函數在你的視圖中包含所有圖像。本質上,輔助函數將模擬圖像緩存的功能,但不是處理實際圖像請求中的所有邏輯,而是在頁面請求期間處理它。因此,當用戶瀏覽器請求實際圖像時,每個圖像版本都已在服務器上創建,鏈接將指向文件系統上的實際圖像。一些僞代碼更好地解釋它...

例如,在show_profile內。刀片視圖

<h1>{{ $profile->name }}</h1> 
<img src="{{ image_helper($profile->image->filename, 'small') }}"> 

helpers.php

function image_helper($filename, $version) { 
    if (!file_exists($version . '_' . $filename)) { 
     // some other helper function ... 
     create_image_version($filename, $version); 
    } 

    return "my/images/" . $version . '_' . $filename; 
} 

function create_image_version($filename, $version) { 
    // if you want to go that route, you would need some kind of mapping 
    // that maps the $version (string) to a codeblock that actually knows 
    // what to do if that version is requested. 
    // E.g. if the version 'small' is requested, 
    // create an image with a dimension of 100x100 
} 
+0

這真是太好了,如果你需要動態地做到這一點。另一方面,爲什麼不簡單地運行一次更新腳本? (在這種情況下,原始圖像也將被保存) – 2016-02-01 23:46:29

+0

更新腳本也是可能的。我認爲這取決於個人喜好或項目環境。或者你可以更快地實施。但要注意的一點是,如果使用更新腳本,則必須始終爲所有圖像預先生成新版本。而動態方法只會生成用戶實際請求的圖像。所以如果你有很多很多的圖片,我會更喜歡動態的方式,因爲你可以節省一些磁盤空間。 – mwallisch 2016-02-02 10:41:21