Laravel Image Cache медленнее исходного

Я использую 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="">

Любая мысль или лучший способ хранить кэш изображений?

4

Решение

Я никогда не использовал 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&param2=2">;
7

Другие решения

Просто некоторые дополнительные мысли, основанные на ответе Кристиана Голлхардта.

Он абсолютно прав, это общая проблема. Но мне не понравился его подход к созданию всех версий, необходимых для создание (или загрузить) оригинального изображения. Потому что есть одна большая проблема, что, если — в какой-то момент в будущем — вы решите, что ваши миниатюры должны быть 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
}
2

По вопросам рекламы [email protected]