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

2022-08-30 07:44:28

我能找到的最好的,一个类型的东西,使页面加载非常慢。iffclosefopen

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


答案 1

您可以通过CURLOPT_NOBODY指示 curl 使用 HTTP HEAD 方法。

或多或少

$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 = > [图标,时间戳]。然后,您可以比较时间戳并重新加载图标。


答案 2

正如Pies所说,你可以使用cURL。你可以让 cURL 只给你标题,而不是正文,这可能会让它更快。错误的域可能总是需要一段时间,因为您将等待请求超时;您可以使用 cURL 更改超时长度。

下面是一个示例:

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';   
}

推荐