【问题标题】:Create thumbnails on the fly with cache or on upload?使用缓存或上传时创建缩略图?
【发布时间】:2013-12-16 05:03:08
【问题描述】:

我目前正在重写一个网站,该网站需要为每个图像设置很多不同的尺寸。过去,我通过在上传时为所有尺寸创建缩略图来做到这一点。但现在我怀疑是性能。这是因为现在我必须更改我的设计,而我的一半图像尺寸不合适。所以我想到了2个解决方案:

  1. 继续这样做并在后端添加一个按钮以重新生成所有图像。问题是我总是需要知道网站每个部分所需的每个尺寸。

  2. 只上传真实大小的图片,显示的时候在SRC标签中加入类似sr="thumbs.php?img=my-image-path/image.jpg&width=120&height=120"的标签。然后创建拇指并显示它。此外,我的脚本会检查拇指是否已经存在,如果存在则不需要重新创建它,只需显示它即可。每 5 天启动一个带有 crontask 的脚本以删除所有拇指(确保只使用有用的)。

我认为第二种解决方案更好,但我有点担心每次显示图像时我都需要调用 php,即使它已经创建,也是 php 让它显示...

感谢您的建议

【问题讨论】:

  • 采用第二种方法,第一次可能会很慢,但最好不要调整永远不会使用的不必要的图像大小,一个缺点是第一次访问图像时速度很慢。跨度>
  • 所以您想提高性能并决定每次有人访问页面时重新生成所有缩略图是个好主意?想想吧。
  • 这真的取决于。对您来说最重要的是什么——上传性能还是展示性能?您的缩略图大小是否有很大的可变性,以至于预生成拇指不实用?你有什么样的交通模式。用户是否一遍又一遍地访问您的页面,高缓存性很重要,或者他们是一次性访问者,他们是第一次尽快将图像下载给他们的地方?您是否考虑过使用异步过程生成拇指,以免影响上传性能?
  • 如果现有的缩略图不好,只需编写一个脚本,使用新规范重新创建它们。即使运行需要几个小时,它仍然比每次有人需要时重新采样图像要好。重新采样图像会像其他任何东西一样消耗您的服务器 CPU。
  • @MikeBrant 您可以通过缓存已渲染的图像轻松提高显示性能。我认为没有理由提前生成多个图像

标签: php thumbnails


【解决方案1】:

如果您没有太多存储空间,请使用第二个选项,如果您没有太多 CPU,请使用第一个选项。

或者您可以结合这些:在第一次打开 php 缩略图生成器时生成并存储图像,下一次只返回缓存的图像。

使用此解决方案,您将只拥有必要的图像,如果您愿意,有时可以删除较旧的图像。

【讨论】:

    【解决方案2】:

    根据最初的问题和后续的 cmets,听起来按需生成适合您,因为在绝对最小化下载时间到最终客户。

    您似乎已经掌握了为您的<img> 标记提供src 值的选项,该值是一个PHP 脚本,该脚本可以提供缓存的缩略图(如果存在),或者即时生成它,缓存它,然后提供它,所以让我给你另一个选择。

    一般来说,当您开始扩展您的网站时,使用 PHP 提供静态资源并不是一个好主意

    1. 这将需要调用 PHP 来处理这些类型的请求的额外开销,使用 Apache、Nginx 等基本 Web 服务器进行了更优化。这意味着您的站点将能够处理每台服务器的更少流量因为它使用额外的内存、CPU 等来提供这些静态内容。
    2. 很难将这些静态资源移动到服务器外部的单个存储库中以提供内容(例如 CDN)。这意味着您必须在为网站提供动力的每台网络服务器上复制文件。

    因此,我的建议是仍然通过网络服务器将图像作为静态图像文件提供,但如果它们丢失,则动态生成缩略图。为此,您只需在 Web 服务器上创建自定义重定向规则或 404 处理程序,以便缩略图目录中与现有缩略图图像不匹配的请求可以重定向到 PHP 脚本以自动生成缩略图并提供图像(浏览器甚至不知道它)。以后针对此缩略图的请求将作为静态图像提供。

    这可以很好地扩展,因为如果将来您需要将静态图像移动到单个服务器(或 CDN),您可以使用原始拉取机制来尝试从您的主服务器获取内容,它将通过我刚才提到的相同机制自动生成它们。

    【讨论】:

    • 感谢您抽出宝贵时间! :) 您如何看待为此目的安装了相同 NAS 存储的多个 Web 服务器(存储图像,按需创建它们)?当 NAS 必须处理并发访问时,您是否有过性能方面的经验? (我考虑到 AWS 的 s3,使用 s3fs fuse 插件)
    • @hek2mgl 仅依靠 NAS 提供图像可能会非常缓慢。幸运的是,S3 有一个解决方案可以让这种情况变得更容易忍受,并实际上为您提供本地磁盘性能。看看 s3fs (code.google.com/p/s3fs)。这允许您在本地文件系统上挂载 S3 存储桶,以便您可以像访问本地驱动器一样访问它。这仍然很慢,但它有一种缓存机制,可以将文件缓存到真正的本地目录中以提高性能。
    • @hek2mgl 呵呵。我想我在您最初的评论中完全掩盖了您对 s3fs 的提及:)
    • @hek2mgl 如果您正处于这样的扩展阶段,您可能会考虑在 S3 存储桶前使用 Cloudfront。使用 S3 作为原始拉取的唯一缺点是,如果您使用专用的 Web 服务器,您将无法自动生成缩略图。在这种情况下,如果不能在上传时生成拇指,我可能会考虑使用异步(即 cron)进程来生成拇指。
    • 抱歉回复晚了,我下班回家的路上。非常感谢您的建议!目前正在使用 AWS 服务,并且不完全确定我应该使用哪些服务。我还需要在网络服务器实例之间共享动态生成的文件。将研究云端服务。
    猜你喜欢
    • 2013-05-31
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2012-09-21
    • 2017-03-19
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多