用于调整大小图像的PHP模糊URL

时间:2013-04-28 15:15:23

标签: php image apache2 image-scaling mod-expires

我们以多种尺寸缓存图片。

图片信息:

因此,我们构建了以下图像缓存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 /ksjdaflkj678687TYTGGGShjk78 / image-file-name.jpg。 为什么?因为在第二个请求中,文件实际存在于磁盘上并作为普通文件返回,然后我们可以使用apache2 mod_expires缓存,而不是在每次请求时下载并调整图像大小。

问题出在这样的远程图像网址上:

原始图像哈希是:

  • eNptzbtOAzEQheGnoZwdr40JQkJIBIo0kI5y5cusM4pjWx4j5fFJICXt_x3pHMZoT4g8Rcp5CvWE0Qme3eTkcMaUq3cZhAdBJOFU7rT6en9FZR6MUXYD3vtH8LPR4Fcd4F4HFZ01q9MzzvjZOXFxeV_SC8fnt8sH7nuN32Esu5NLJHhtyzYzlbHcSPCjDvK1HgV3RRr3WpZ_0my7EHqSUVfMro3agG8IvwgbqxUkKtQ5wN8SrFJQ0tQk_gCey1fZ

这使得网址如下所示:

此网址的哈希部分超过255个字符,这使得Apache错误 - https://serverfault.com/questions/120397/max-length-of-url-257-characters-for-mod-rewrite

编辑:只是添加 - 问题在于哈希的长度。如果散列低于255个字符,则此解决方案可以完美运行。

这里有几个注意事项:

  1. 缓存URL与调用它的服务器位于不同的服务器上。它们不共享数据库,因此原始URL必须包含在URL中。
  2. 我需要对URL进行哈希处理并使用哈希作为目录名称,以便我们可以将已调整大小的文件物理保存到磁盘以供将来请求使用。
  3. 这意味着在请求时 - 它会神奇地抓取文件并将其保存到磁盘。根据要求2,它只返回物理图像。
  4. 如果cache.example.com和调用该URL的网站位于同一台服务器上,并且可以共享数据库,那么我们可以将图像URL保存到表中并返回哈希或密钥等。不幸的是,这不是一种选择。
  5. 解决方案?

    • 我能想到的唯一解决方案是以某种方式压缩URL。但是,由于我需要(和我做)base64对其进行编码以使其在URL中工作,这会增加额外的大小。

    有没有人有任何想法?

    我遇到的问题与this question非常相似。

1 个答案:

答案 0 :(得分:0)

上次检查时,网址最多可容纳2083个字符。我怀疑是否有一种算法可以使其适合少于255个US-ASCII字符。

由于您似乎是首先生成URL的那个,我只是将目标URL存储在服务器上(例如,在数据库表中)并使用其关联的ID(或实际的哈希)。然后,从ID或散列中获取URL将是微不足道的。

GET方法不是为传输大量数据而设计的。

修改

我的回答显然不够明确,所以我会试着澄清一下。

假设您要链接到http://www.example.com/media/test.jpg。到目前为止,您将http://www.example.com/media/test.jpg混淆为例如uggcabcjjjwrknzcyrmpbzjzrqvnxgrfgwwct并生成如下网址:

http://cache.example.com/image/150x125/uggcabcjjjwrknzcyrmpbzjzrqvnxgrfgwwct

我的建议是将URL存储到数据库表中:

url_id url
====== =====================================
     1 http://www.example.com/media/test.jpg

...并创建一个这样的网址:

http://cache.example.com/image/150x125/1

当你mod_rewrite URL时,你运行这个查询:

SELECT url
FROM url_cache
WHERE url_id=1

...而且,瞧!,你有http://www.example.com/media/test.jpg,而不需要在网址中传输它。

或者,您可以存储和使用真实的哈希:

url_id url                                   hash
====== ===================================== =====
     1 http://www.example.com/media/test.jpg ae4a962c5c40dc8d59554a503719ce445c047246837c7203d319cd5b0b5b3703

......和:

http://cache.example.com/image/150x125/ae4a962c5c40dc8d59554a503719ce445c047246837c7203d319cd5b0b5b3703

因为它是一个真正的哈希而不是一个模糊的文本,你知道它的大小。