2013-04-28 29 views
0

我們將圖像緩存爲多種尺寸。PHP調整大小圖像的模糊URL

圖像信息:

所以我們建立下面的圖像緩存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緩存,並且不會在每個請求上下載並調整圖像大小。

的問題是與遠程圖像URL是這樣的:

原始的圖像的哈希值是:

  • eNptzbtOAzEQheGnoZwdr40JQkJIBIo0kI5y5cusM4pjWx4j5fFJICXt_x3pHMZoT4g8Rcp5CvWE0Qme3eTkcMaUq3cZhAdBJOFU7rT6en9FZR6MUXYD3vtH8LPR4Fcd4F4HFZ01q9MzzvjZOXFxeV_SC8fnt8sH7nuN32Esu5NLJHhtyzYzlbHcSPCjDvK1HgV3RRr3WpZ_0my7EHqSUVfMro3agG8 IvwgbqxUkKtQ5wN8SrFJQ0tQk_gCey1fZ

這使URL看起來像這樣:

此URL的哈希部分超過255個字符,這使得Apache的錯誤 - https://serverfault.com/questions/120397/max-length-of-url-257-characters-for-mod-rewrite

編輯:只需添加 - 問題是散列的長度。使用255字符以下的散列,此解決方案完美工作。

這裏有幾方面的考慮:

  1. 緩存URL是在不同的服務器上從調用它。他們不共享數據庫,所以原始URL必須包含在URL中。
  2. 我需要散列URL並使用散列作爲目錄名稱,以便我們可以物理上將調整大小的文件保存到磁盤以備將來使用。
  3. 這意味着,根據要求 - 它魔法般地製作文件並將其保存到磁盤。根據要求二,它只是返回物理圖像。
  4. 如果cache.example.com和調用URL的網站位於同一臺服務器上,並且可以共享數據庫,那麼我們可以將圖像URL保存到一個表中,並返回一個散列或關鍵字或其他內容。不幸的是,這不是一個選項。

解決方案?

  • 我能想到的唯一解決方案是以某種方式壓縮URL。然而,因爲我需要(我也是)base64對它進行編碼以使其沿着URL工作,所以這增加了額外的大小。

有沒有人有任何想法?

我遇到的問題與this question非常相似。

+0

只需添加 - 問題與散列的長度。使用255字符以下的散列,此解決方案完美工作。 – HenryHayes 2013-04-28 15:18:06

+0

您使用的散列算法與原始數據幾乎一樣長? – 2013-04-28 15:19:26

+0

HiÁlvaroG.Vicario,$ hash = strtr(base64_encode(gzcompress($ url,9)),'+/=','-_〜');而解碼則相反。當然,這不是一個哈希。它必須是可解碼的,所以我已經檢索了URL。 – HenryHayes 2013-04-28 15:32:22

回答

0

我上次檢查時,一個URL最多可容納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併產生這樣的URL:

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

我的建議是,你存儲URL到數據庫表:

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

...你創建這樣一個URL:

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

當您mod_rewrite的URL,您運行此查詢:

SELECT url 
FROM url_cache 
WHERE url_id=1 

...和voilá!,你有http://www.example.com/media/test.jpg而不需要在URL中傳輸它。

或者,你可以存儲和使用真正哈希:

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

...和:

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

因爲它是一個真正的哈希值,而不是你知道一個模糊的文字大小之前。

+0

問題不在於URL的長度。問題在於散列的長度。如果超過255個字符,apache2會假設它太長。文件夾或文件名的最大大小爲255個字符。在上面的示例中,散列值大於255個字符,這意味着地址欄上要求的目錄大小大於255個字符,並且apache拒絕該請求。此外,我無法創建該文件夾,只要O/s不會創建名稱很長的文件夾,就可以使用散列將調整大小的圖像保存到磁盤。我需要減少散列大小。 – HenryHayes 2013-04-28 15:51:45

+0

回覆:我只是將目標URL存儲在服務器上(例如,在數據庫表中)並使用其關聯的ID。如上所述,「緩存URL與調用它的服務器不在同一臺服務器上,它們不共享數據庫,因此原始URL必須包含在URL中。」你的建議是可行的,如果他們都可以訪問相同的數據庫 - 但他們不:( – HenryHayes 2013-04-28 15:55:23

+0

好吧,剛剛看到你的第二條消息,我以爲你不明白答案。 – 2013-04-28 16:02:51