【发布时间】:2010-11-24 17:40:25
【问题描述】:
我正在为图书 ISBN 生成图片的动态 URL。我需要一种可靠的 PHP 方法来检查图像是否实际存在于远程 url。我用不同的 PHP 库、curl 等尝试了各种方法,但没有一个能很好地工作,其中一些非常慢。鉴于我需要为数据库中的每本书生成(并检查!)大约 60 个 URL,这是一个巨大的等待时间。有什么线索吗?
【问题讨论】:
我正在为图书 ISBN 生成图片的动态 URL。我需要一种可靠的 PHP 方法来检查图像是否实际存在于远程 url。我用不同的 PHP 库、curl 等尝试了各种方法,但没有一个能很好地工作,其中一些非常慢。鉴于我需要为数据库中的每本书生成(并检查!)大约 60 个 URL,这是一个巨大的等待时间。有什么线索吗?
【问题讨论】:
function checkRemoteFile($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
// don't download content
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
if($result !== FALSE)
{
return true;
}
else
{
return false;
}
}
--> 如果你的主机支持 curl,这是最快的方法
【讨论】:
return curl_exec( $ch ) !== FALSE; 而不是if/else
curl_close($ch);
像这样使用getimagesize()方法
$external_link = ‘http://www.example.com/example.jpg’;
if (@getimagesize($external_link)) {
echo “image exists “;
} else {
echo “image does not exist “;
}
【讨论】:
这里没有“简单”的方法 - 至少,您需要生成 HEAD 请求并检查生成的内容类型以确保它是图像。这没有考虑到可能的推荐人问题。 curl 是这里的方法。
【讨论】:
您可以使用curl。只需将 curl 选项 CURLOPT_NOBODY 设置为 true。这将跳过正文信息,只获取头部(因此也是 http 代码)。然后,您可以使用 CURLOPT_FAILONERROR 将整个过程变成真/假类型检查
【讨论】:
我一直在为我的房地产图片跟踪这样做......
$im = @imagecreatefromjpeg($pathtoimg);
if($im)
imagedestroy($im); // dont save, just ack...
elseif(!$missing[$inum])
$img404arr[] = $inum;
它“似乎”比下载实际图像要快,从平均 100k 的图像中下载每个图像大约需要 0.3 秒。
我希望我可以在不下载任何内容的情况下进行标头检查并读取是否得到 200 和 404。谁有这个方便的?
【讨论】:
【讨论】:
if(@getimagesize($remoteImageURL)){
//image exists!
}else{
//image does not exist.
}
【讨论】:
目前可能还没有实际意义,但这对我有用:
function is_webfile($webfile)
{
$fp = @fopen($webfile, "r");
if ($fp !== false)
fclose($fp);
return($fp);
}
【讨论】:
If the open fails, an error of level E_WARNING is generated. You may use @ to suppress this warning.
来自https://www.experts-exchange.com的解决方案
<?php
function url_exists($url) {
if (!$fp = curl_init($url)) return false;
return true;
}
?>
【讨论】:
如果图像都存在于同一个远程服务器上(或在同一个网络中),您可以在该服务器上运行一个 Web 服务,该服务将检查文件系统中的图像文件并返回一个布尔值指示图像是否存在与否。
【讨论】: