有没有办法检查远程图像是否存在? PHP

时间:2012-01-19 12:30:23

标签: php nginx cdn

我的网站在LAMP中运行,我的图片CDN在nginx中。

我想做的是: 检查请求的映像是否在CDN服务器中有副本,如果是,则将副本借出到cdn服务器,否则,为用户加载本地副本。

是否以编程方式检查远程CDN图像是否存在?

(也许确定标题?因为我注意到如果请求图像不存在,则返回404)

enter image description here

5 个答案:

答案 0 :(得分:3)

我使用此方法ping远程文件:

  /**
   * Use HTTP GET to ping an url
   *
   * /!\ Warning, the return value is always true, you must use === to test the response type too.
   * 
   * @param string $url
   * @return boolean true or the error message
   */
  public static function pingDistantFile($url)
  {
    $options = array(
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_URL => $url,
      CURLOPT_FAILONERROR => true, // HTTP code > 400 will throw curl error
    );

    $ch = curl_init();
    curl_setopt_array($ch, $options);
    $return = curl_exec($ch);

    if ($return === false)
    {
      return curl_error($ch);
    }
    else
    {
      return true;
    }
  }

您也可以使用HEAD方法,但也许您的CDN已禁用。

答案 1 :(得分:2)

只要副本是公开的,您就可以使用cURL检查404。 See this question详细说明了如何做到这一点。

答案 2 :(得分:2)

您可以使用file_get_contents:

 $content = file_get_contents("path_to_your_remote_img_file");
 if ($content === FALSE)
 {
     /*Load local copy*/
 }
 else
 {
     /*Load $content*/
 }

哦还有一件事 - 如果你只想用img标签显示图像,你可以简单地这样做 - 使用img标签onerror属性 - 如果服务器上不存在图像,则onerror属性将显示本地文件:

<img src="path_to_your_remote_img_file" onerror='this.src="path_to_your_local_img_file"'>

您可以在此处阅读类似的问题:detect broken image using php

答案 3 :(得分:1)

另一种更简单的方法 - 没有cURL:

$headers = get_headers('http://example.com/image.jpg', 1);
if($headers[0] == 'HTTP/1.1 200 OK')
{
  //image exist
}
else
{
  //some kind of error
}

答案 4 :(得分:-1)

<?php
if (is_array(getimagesize("http://www.imagelocation.com/image.png"))){
   // Image ok
} else {
   // Image not ok
}
?>