Я использую Intervention / imagecache для кэширования своего изображения.
Однако загрузка изображения кэша медленнее, чем файла исходного изображения.
Почти дополнительные 60-70 мс во времени (проверено в Chrome Inspect Element Network)
Это код, как я загружаю изображение в 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="">
Любая мысль или лучший способ хранить кэш изображений?
Я никогда не использовал Laravel, но это общая проблема.
Если вы позволите веб-серверу обрабатывать доставку изображения клиенту, интерпретатор php не будет запущен.
Если вы доставляете что-то через PHP (я полагаю, потому что вы пишете что-то о кэшированном изображении), вам нужен интерпретатор php. Затем вам нужно выполнить скрипт, и вся его логика, которая на скриптовом языке всегда медленнее, чем на нативном.
Лучше всего сохранить изображение в файловой системе и создать ссылку на него вместо сценария PHP.
Это означает, например:
Где-то в вашем приложении у вас есть точка, где создается исходное изображение. Теперь подумайте, какие версии вам нужны. Измените размер, обрежьте, отредактируйте его сколько хотите. Сохраните каждую нужную версию в своей файловой системе. Таким образом, у вас есть вместо image.jpg
image-200x200-cropped-with-branding.jpg
, На этом этапе производительность не должна быть настолько важной (изображение будет просматриваться тысячи раз, но будет создано только один раз).
Вы хотите иметь
<img src="/path/to/image-200x200-cropped-with-branding.jpg">;
вместо
<img src="/image.php?param1=1¶m2=2">;
Просто некоторые дополнительные мысли, основанные на ответе Кристиана Голлхардта.
Он абсолютно прав, это общая проблема. Но мне не понравился его подход к созданию всех версий, необходимых для создание (или загрузить) оригинального изображения. Потому что есть одна большая проблема, что, если — в какой-то момент в будущем — вы решите, что ваши миниатюры должны быть 250×250 вместо 200×200 (или любого другого измерения)? Поэтому в основном я хочу гибкости, предлагаемой пакетом ImageCache, без снижения производительности.
На самом деле я этого не реализовал, но мой подход заключается в использовании некоторой промежуточной вспомогательной функции для включения всех ваших изображений в ваши представления. По сути, вспомогательная функция имитирует функциональность кэша изображений, но вместо обработки всей этой логики в реальном запросе изображения она будет обрабатываться во время запроса страницы. Таким образом, в то время, когда фактическое изображение запрашивается из браузера пользователя, каждая версия изображения уже создана на сервере, и ссылка будет указывать на фактическое изображение в файловой системе. Какой-то псевдокод объясняет это лучше …
например в пределах show_profile.blade Посмотреть
<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
}