【发布时间】:2013-04-22 06:33:19
【问题描述】:
我们缓存多种尺寸的图片。
图片信息:
- 原网址:http://www.example-store.com/images/some-image.jpg
- 宽度:120
- 身高:150
- 首选图片文件名:image-file-name.jpg
所以我们构建如下图片缓存URL:
http://cache.example.com/image/120x150/ksjdaflkj678687TYTGGGShjk78/image-file-name.jpg
当请求此 URL 时,http://cache.example.com/image/120x150/ksjdaflkj678687TYTGGGShjk78/image-file-name.jpg,这在幕后(htaccess 类型的东西)被重写为:http://cache.example.com/image.php?height=120&width=150&originalUrlHashed=ksjdaflkj678687TYTGGGShjk78&preferredFileName=image-file-name.jpg
哈希图像被解码,从原始位置下载,调整大小并物理保存在这里:/image/120x150/ksjdaflkj678687TYTGGGGShjk78/image-file-name.jpg。 为什么?因为在第二次请求时,文件物理存在于磁盘上并作为普通文件返回,然后我们可以使用 apache2 mod_expires 缓存,而不是在每次请求时下载和调整图像大小。 p>
问题在于这样的远程图像 URL:
原始图像哈希为:
- eNptzbtOAzEQheGnoZwdr40JQkJIBIo0kI5y5cusM4pjWx4j5fFJICXt_x3pHMZoT4g8Rcp5CvWE0Qme3eTkcMaUq3cZhAdBJOFU7rT6en9FZR6MUXYD3vtH8LPR4Fcd4F4HFZ01q9MzzvjZOXFxeV_SC8fnt8sH7nuN32Esu5NLJHhtyzYzlbHcSPCjDvK1HgV3RRr3WpZ_0my7EHqSUVfMro3agG8IvwgbqxUkKtQ5wN8SrFJQ0tQk_gCey1fZ LI>
这使得 URL 看起来像这样:
此 URL 的哈希部分超过 255 个字符,这会导致 Apache 错误 - https://serverfault.com/questions/120397/max-length-of-url-257-characters-for-mod-rewrite
编辑:只是补充一下 - 问题在于哈希的长度。使用 255 个字符以下的哈希,此解决方案完美运行。
这里有几个注意事项:
- 缓存 URL 与调用它的服务器位于不同的服务器上。它们不共享数据库,因此原始 URL 必须包含在 URL 中。
- 我需要对 URL 进行哈希处理并将哈希值用作目录名称,以便我们可以将调整大小的文件物理保存到磁盘以供将来请求。
- 这意味着根据请求 - 它会神奇地创建文件并将其保存到磁盘。根据请求二,它只返回物理图像。
- 如果 cache.example.com 和调用 URL 的网站在同一台服务器上,并且可以共享一个数据库,那么我们可以将图像 URL 保存到一个表中并返回一个哈希或键或其他东西。很遗憾,这不是一个选项。
解决方案?
- 我能想到的唯一解决方案是以某种方式压缩 URL。但是,由于我需要(并且确实)对其进行 base64 编码以使其沿 URL 工作,因此这会增加它的大小。
有人有什么想法吗?
我遇到的问题和this question很相似。
【问题讨论】:
-
只是补充一下 - 问题在于哈希的长度。使用 255 个字符以下的哈希,此解决方案完美运行。
-
你用的是什么哈希算法,几乎和原始数据一样长?
-
嗨 Álvaro G. Vicario, $hash = strtr(base64_encode(gzcompress($url, 9)), '+/=', '-_~');与解码相反。当然,它不是这样的哈希。它必须是可解码的,所以我已经检索了 URL。
-
一开始我只是对 URL 进行 base64 编码。但是,我之前在它变得太大时添加了 gzcompress。然后某些商店现在增加了他们的图片 URL 长度 - 所以问题又出现了。我想不出任何减少哈希大小的方法。哈希只是一个包含 URL 的 base64 编码字符串。
-
我只是想澄清一下。图像缓存应用程序是来自调用它的网站的独立应用程序。这两个应用程序不共享任何其他类型存储的数据库。原始图像 URL 必须提供给缓存服务器。
标签: php image apache2 image-scaling mod-expires