通过动态调整大小服务图像

Mor*_*dur 23 performance webserver image image-resizing

我的公司最近开始遇到我们网站的图像处理问题.

我们有几个网站(成人娱乐),显示像DVD封面,快照和类似的图像.我们有大约100,000部电影,每部电影我们平均有30部快照+封面.几乎每个图像都有一个附加版本,模糊和覆盖非成员,这导致每部电影约50个图像或总共500万个基本图像.每个图像都有多个版本,具体取决于它放置在页面上的位置(缩略图,原始,小预览,不太小的预览,顶部列表中的小图像等),这会产生比图像更多的图像.我很想数数.

现在我有了使用服务器即时生成图像的想法,因为为所有不同的页面生成所有不同的图像变得非常笨拙(因为不同的页面有时甚至需要不同的图像大小来完成相同的任务) .

有没有人知道一个图像处理服务器可以动态缩小图像所以我们只需要提供原始图像,网络人员只需要他们需要的任何大小?

要求:

  • 性能非常高(每天数千名用户)
  • 即时模糊和叠加创建
  • 即时调整大小(有和没有保持纵横比)
  • 可以处理数百万张图片
  • 必须能够读取JPG,GIF,PNG和BMP并在它们之间进行转换

安全性并不是一个令人担忧的问题,即通过URL操作已经可以达到不模糊的图像,并且更安全性会很好但是不需要它,坦率地说我停止了关注(在未能进入我的同事头之后为什么(对于我们的小经销商)使用http://example.com/view_image.php?filename=/data/images/01020304.jpg来显示图像是一个坏主意.)

我们尝试使用PHP脚本来执行此操作,但对于这么多用户来说,性能太慢了.

提前感谢您提出的任何建议.

Mat*_*iva 27

我建议你设置一个专用的Web服务器来处理图像大小调整并提供最终结果.我做了类似的事情,虽然规模要小得多.它基本上消除了检查缓存的过程.

它的工作原理如下:

  • 您请求将所需大小附加到文件名的图像 http://imageserver/someimage.150x120.jpg
  • 如果图像存在,则返回时不进行其他处理(这是主要点,缓存检查是隐式的)
  • 如果图像不存在,则通过.htaccess处理未找到的404,并将请求重新路由到生成所需大小图像的脚本
  • 在脚本中指定允许的大小列表,以避免攻击请求每个可能大小的脚本关闭服务器
  • 将此保留在无cookie域上以最大限度地减少不必要的流量

编辑:我不认为PHP本身会使这个过程变慢,因为在这种情况下PHP脚本减少到最小:图像缩放是由用C编写的内置库完成的.无论你做什么,你都必须使用像这样的图书馆(GD或libmagick等),这是不可避免的.至少在你的系统中你完全省去了检查缓存的开销,从而进一步减少了PHP的交互.您可以在现有服务器上实现此功能,因此我认为这是一个非常适合您预算的解决方案.

  • 只是想提供更多反馈:9个月以及之后的许多会议和讨论,我们将几个主要页面切换到此解决方案,一周完美运行,同时我们为此回收的服务器负载最小.按需生成的缓存中已有12GB图像.再次感谢您提供出色的解决方案 (2认同)

Bar*_*ttJ 7

基于

我们尝试使用PHP脚本来执行此操作,但对于这么多用户来说,性能太慢了.

我假设你没有缓存结果.我建议将生成的图像缓存一两天(即让您的脚本检查是否已生成缩略图,如果是,请使用它,如果它还没有动态生成).

这会大大提高性能,因为我认为主页面/起始页面可能比随机视频X有更多的点击次数,因此在查看主页面时,不需要在缓存时创建图像.当用户Y观看电影X时,他们不会注意到延迟,因为它只需要生成那一页.

对于"即时调整大小"方面 - 带宽对您有多重要?我想假设你经历了很多关于电影的事情,每次请求中额外的kb图像不会造成太大的伤害.如果是这种情况,您可以使用更大的图像并设置宽度和高度,让浏览器为您进行缩放.

  • 甚至比在本地缓存它们更好......通过CDN请求图像,然后CDN将为您缓存所有生成的图像并以更快的速度提供服务,带来更便宜的带宽成本.这就是我们这样做的方式,它非常有效. (4认同)