【问题标题】:How can I check if the cached image has same width & height as url image?如何检查缓存的图像是否与 url 图像具有相同的宽度和高度?
【发布时间】:2015-10-08 12:20:19
【问题描述】:

我正在编写一个脚本,我只是从请求的图像 url 调整图像大小并缓存它们。我还将宽度和高度作为请求的可选参数。我正在按文件名缓存图像,并且当用户请求具有不同宽度或高度的相同图像时,我想涵盖一个用例。

由于我使用的是 Codeigniter 的图像大小调整库,因此文件名附加了 _thumb。这就是我存储图像的方式。

在这种情况下我该怎么办?一种解决方案是检查调整大小的图像和缓存图像的md5 哈希。

这是我想做的事情:

            $ch = curl_init($url); //initialize cURL

            curl_setopt($ch, CURLOPT_HEADER, 0); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
            curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
            $dataToWrite = curl_exec($ch); //Execute the given cURL session. 

            curl_close ($ch); //close the given cURL session
            $fp = fopen($dirPath.$filename,'w');
            fwrite($fp, $dataToWrite); 
            fclose($fp);

最后,

           if (md5_file($dirPath.$filename) == md5_file($dirPath.$resizedImage){
                serveimagefromcache() & deletethedownloadedfile();
           } else {
               resizetheimage() && serveit(); 
           }

我也关心性能,如果有任何其他建议,我将不胜感激。

【问题讨论】:

  • 一个原始但非常有效的解决方案是更改命名方案,使其包含分辨率。像mypic0001_1600_1200.jpg 这样的东西。这是非常有效的,因为您不必打开文件来获取信息。您可以通过该命名模式glob在文件系统中缓存文件夹内容。
  • 会有性能问题吗?
  • 它肯定比任何其他策略(如校验和计算或实际从文件中读取图像尺寸)都要快得多。这就是我所说的“原始但极其高效”的意思。
  • 一种变体是为不同的图像尺寸设置单独的缓存文件夹。这样文件名就无关紧要了,您只需查看所需的缓存文件夹,看看是否已经存在匹配的缓存图像。
  • 我可能最终会使用基于命名约定的解决方案,在有人告诉我查看哈希方法之前,我一直在考虑这个解决方案。

标签: php image codeigniter caching


【解决方案1】:

尽管@arkascha 的建议非常好,但将文件保存为文件名哈希会更好。

有了这个,

$ext   = pathinfo($filename, PATHINFO_EXTENSION);    
$filehash = sha1($filename.$width.$height);
$filename = $filehash.".".$ext

您可以防止我遇到的问题。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2011-08-28
    • 2015-05-17
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2016-05-13
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多