【问题标题】:How to check if a file exists from a url如何从 url 检查文件是否存在
【发布时间】:2011-12-02 20:12:20
【问题描述】:

我需要检查远程服务器上是否存在特定文件。使用is_file()file_exists() 不起作用。任何想法如何快速轻松地做到这一点?

【问题讨论】:

标签: php file curl fsockopen file-exists


【解决方案1】:

您不需要 CURL... 只是想检查文件是否存在的开销太大...

使用PHP's get_header

$headers=get_headers($url);

然后检查 $result[0] 是否包含 200 OK(这意味着文件在那里)

检查 URL 是否有效的函数可能是这样的:

function UR_exists($url){
   $headers=get_headers($url);
   return stripos($headers[0],"200 OK")?true:false;
}

/* You can test a URL like this (sample) */
if(UR_exists("http://www.amazingjokes.com/"))
   echo "This page exists";
else
   echo "This page does not exist";

【讨论】:

  • By default get_headers uses a GET request to fetch the headers - 所以不是 curl 请求的开销(不太确定它所指的是什么开销) - 有一个浪费的 GET 请求会丢弃正文 - 而不是使用 HEAD请求并且只接收标头。
  • @AD7six:我假设在内存中设置 cURL 会导致过载,我做了一些测试比较这两种方法,你是对的:如果你加载了 cURL 库,那么使用与 get_headers 相比,可接受的方法。我比较了所有 3 种提到的方法:cURL 是最快的,然后是 get_headers,然后是 getimagesize,加上缺点 getimagesize 只会告诉你图像是否存在。这是被问到的,所以在这里它仍然是一个有效的答案,但它不是很通用。
  • @ad7six 你确定 get_headers 正在请求正文吗?仅供参考,您可以通过流上下文覆盖 GET 请求:stream_context_set_default(['http' => ['method' => 'HEAD']]); $headers = get_headers('example.com');
  • 答案很旧但非常有用
  • @AD7six 提到的使用 HEAD 请求的示例:php.net/manual/en/function.get-headers.php
【解决方案2】:

你必须使用 CURL

function does_url_exists($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($code == 200) {
        $status = true;
    } else {
        $status = false;
    }
    curl_close($ch);
    return $status;
}

【讨论】:

  • 你不需要 CURL 来做这个......太多的开销......在下面查看我的答案(使用 PHP 的 get_headers !)
  • 和其他的一样,不检查是否是文件,只检查URL。 echo is_url_exists('http://stackoverflow.com') ? 'Yes' : 'No'; 回显Yes
  • 这对我不起作用,直到我添加了 CURLOPT_FOLLOWLOCATION,true 指令
  • 函数名应该是dos_url_exists ;)
【解决方案3】:

我刚刚找到了这个解决方案:

if(@getimagesize($remoteImageURL)){
    //image exists!
}else{
    //image does not exist.
}

来源:http://www.dreamincode.net/forums/topic/11197-checking-if-file-exists-on-remote-server/

【讨论】:

  • 您的意思是getimagesize?如这里:uk1.php.net/getimagesize 如果是这样,那么文档说它可以引用本地或远程文件。
  • getimagesize 开销太大。如果您只想知道文件是否存在,请使用 PHP 的 get_header(检查我的答案)
  • 还不错,但它只适用于图像!
  • 我同意 patrick 这不是一个解决方案,我希望没有太多人使用这种方法。
  • @herbert。这一切都取决于这将被调用多少次以及人们将使用多少次......
【解决方案4】:

您好,根据我们在 2 个不同服务器之间的测试,结果如下:

使用 curl 检查 10 个 .png 文件(每个大约 5 mb)平均需要 5.7 秒。 对同一件事使用标头检查平均需要 7.8 秒!

所以在我们的测试中,如果你必须检查更大的文件,curl 会更快!

我们的 curl 函数是:

function remote_file_exists($url){
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if( $httpCode == 200 ){return true;}
    return false;
}

这是我们的标头检查示例:

function UR_exists($url){
   $headers=get_headers($url);
   return stripos($headers[0],"200 OK")?true:false;
}

【讨论】:

    【解决方案5】:

    你可以使用函数file_get_contents();

    if(file_get_contents('https://example.com/example.txt')) {
        //File exists
    }
    

    【讨论】:

    • 它会减慢你的应用程序并增加 TTFB (Time To Take First Byte)。所以永远不要使用这个功能。
    • 它需要文件的所有内容......如果你想检查大文件,时间太长了
    • 如果 url 错误,它也会破坏你的页面。我的意思是给定路径上不存在文件。
    【解决方案6】:

    用 curl 发出请求,看看它是否返回 404 状态码。使用 HEAD 请求方法执行请求,因此它只返回没有正文的标头。

    【讨论】:

      【解决方案7】:
      $file = 'https://picsum.photos/200/300';
      $file_headers = @get_headers($file);
      if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
          $exists = false;
      }
      else {
          $exists = true;
      } 
      

      【讨论】:

        【解决方案8】:
            $headers = get_headers((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://" . $_SERVER[HTTP_HOST] . '/uploads/' . $MAIN['id'] . '.pdf');
            $fileExist = (stripos($headers[0], "200 OK") ? true : false);
            if ($fileExist) {
            ?>
            <a class="button" href="/uploads/<?= $MAIN['id'] ?>.pdf" download>скачать</a> 
            <? }
            ?>
        

        【讨论】:

        • 欢迎来到 Stack Overflow!请参阅How to Answer。永远记住,在回答问题时,您不仅要回答 OP,还要回答未来的读者尤其是,在回答 9 岁的问题时。因此,请edit 发帖说明为什么此代码有效。
        猜你喜欢
        • 2015-11-10
        • 1970-01-01
        • 2020-07-05
        • 2020-06-25
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        相关资源
        最近更新 更多