【问题标题】:Laravel Image Cache slower than sourceLaravel 图像缓存比源代码慢
【发布时间】:2015-06-04 11:57:03
【问题描述】:

我正在使用 Intervention/imagecache 来缓存我的图像。 但是,缓存图像加载速度比源图像文件慢。 几乎额外的 60-70 毫秒延迟时间(在 chrome 检查元素网络中测试)

这是我在 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="">

存储图像缓存的任何想法或更好的方法?

【问题讨论】:

标签: php laravel-4 laravel-routing image-caching


【解决方案1】:

我从未使用过 laravel,但这是一个普遍问题。

如果让 webserver 处理图片到客户端的传递,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">;

【讨论】:

  • PHP 解释器是一回事,引导整个框架会使情况变得更糟...
  • 你说的有点道理,看来我必须使用不同的方法。
  • 我有同样的问题。感谢@Christian,您的解决方法为我解决了这个问题。为你 +1
【解决方案2】:

只是一些额外的想法,基于 Christian Gollhardt 的回答。

他是绝对正确的,这是一个普遍的问题。但我不喜欢他创建创建(或上传)原始图像所需的所有版本的方法。因为有一个大问题,如果 - 在未来的某个时刻 - 你决定你的缩略图应该是 250x250 而不是 200x200(或任何其他尺寸)怎么办?所以基本上我想要的是 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
}

【讨论】:

  • 这真的很好,如果你需要动态地做的话。另一方面,为什么不简单地拥有一个运行一次的更新脚本呢? (当然,在这种情况下,原始图像也会被保存)
  • 更新脚本也是可能的。我认为这取决于个人喜好或项目情况。或者任何你可以更快实现的东西。不过要记住的是,如果您使用更新脚本,您总是必须为所有图像预先生成新版本。而使用动态方法,只会生成用户实际请求的图像。所以如果你有很多很多的图片,我更喜欢动态的方式,因为你可以节省一些磁盘空间。
猜你喜欢
  • 2015-02-15
  • 2016-01-18
  • 1970-01-01
  • 2014-10-07
  • 2015-03-11
  • 2013-07-08
  • 2020-10-08
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多