如何使用PHP检查远程文件是否存在?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (10)

我能找到的最好的,if fclose fopen类型的东西,使页面加载真的很慢。

基本上我想要做的是以下几点:我有一个网站列表,我想在他们旁边显示他们的图标。但是,如果网站没有网站,我想用另一张图片替换它,而不是显示损坏的图片。

提问于
用户回答回答于

下面是一个例子:

function remoteFileExists($url) {
    $curl = curl_init($url);

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    $ret = false;

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 200) {
            $ret = true;   
        }
    }

    curl_close($curl);

    return $ret;
}

$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
    echo 'file exists';
} else {
    echo 'file does not exist';   
}
用户回答回答于

你可以通过CURLOPT_NOBODY指示curl使用HTTPHead方法。

$ch = curl_init("http://www.example.com/favicon.ico");

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);

无论如何,你只保存HTTP传输的成本,而不是TCP连接的建立和关闭。如果你喜欢小的话,你可能不会看到有多大的进步。

如果结果太慢,本地缓存结果似乎是个好主意。Head检查文件的时间,并在标题中返回它。你可以像浏览器一样使用CURLINFO_FILETIME的图标。在缓存中可以存储URL => [ favicon, timestamp ],你可以比较时间戳并重新加载该图标。

扫码关注云+社区