0

我有这种情况,我有一些图片:

http://www.example.com/test1.jpg
http://www.example.com/test2.jpg
http://www.example.com/test3.jpg
....

其中一些可能是死链接,图像不会显示,而是一个小broken图标。

我这样做是为了检查这些图像:

if(!is_array(getimagesize($mediapath))){
  $mediapath = '';
} 
return $mediapath;

基本上getimagesize获取图像的图像大小:),并返回一个数组。如果图像损坏,则会出错。

这是我的问题。该代码可以正常工作,但现在我收到错误消息,告诉我某些文件不存在:

Warning: getimagesize(http://www.example.com/test2.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampp\htdocs\zend\models\mappers\search.php on line 173

但这是想要的结果,我只是不希望页面上出现这些错误,不,我不想禁用 PHP 中的错误,我希望 'getimagesize' 方法不显示该错误。

4

3 回答 3

5

您可以get_headers在这种情况下使用该功能:

$url = 'http://www.example.com/test1.jpg';
print_r(get_headers($url));

它将报告一个这样的数组:

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT
    [2] => Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    [4] => ETag: "3f80f-1b6-3e1cb03b"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 438
    [7] => Connection: close
    [8] => Content-Type: text/html
)

您可以使用该 http 响应来了解图像是否存在:)

于 2012-02-15T20:55:43.747 回答
2

在极少数情况下,错误抑制运算符不是邪恶的,这就是其中之一。

if(@!is_array(getimagesize($mediapath))){
            $mediapath = '';
        } 
        return $mediapath;

注意@语句的前缀。它将导致任何错误、警告或通知被抑制。请注意,如果发生致命错误,脚本将终止而不给出指示!

于 2012-02-15T20:55:44.603 回答
2

这是一种极其低效的测试方法。PHP 必须先下载整个图像,然后才能将文件的内容传递给 getimagesize()。

你最好使用 curl。为每个 url发出HEAD请求,看看你是否得到 200 或 404 响应。这相对便宜,每个 URL 只需一个 TCP 连接和几个数据包(例如,4k 的数据传输),而每个完整图像文件需要 200+k。

于 2012-02-15T20:56:05.607 回答