• PHP判断远程文件是否存在的几种方法


    在做一个图片预览中图的东西,遇到一个问题,就是要判断远程文件是否存在(不是同一台服务器)。
    代码如下:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //方法一
    function file_exists ( $url )
    {
    $ch = curl_init();
    curl_setopt( $ch , curlopt_url, $url );
    curl_setopt( $ch , curlopt_nobody, 1); // 不下载
    curl_setopt( $ch , curlopt_failonerror, 1);
    curl_setopt( $ch , curlopt_returntransfer, 1);
     
    if (curl_exec( $ch )!==false)
    return true;
    else
    return false;
    }
     
    //方法二
    function file_exists2( $url )
    {
    if ( file_get_contents ( $url ,0,null,0,1))
    return 1;
    else
    return 0;
    }
    //方法三
    function file_exists ( $url ) {
    $curl = curl_init( $url );
    // 不取回数据
    curl_setopt( $curl , CURLOPT_NOBODY, true);
    // 发送请求
    $result = curl_exec( $curl );
    $found = false;
    // 如果请求没有发送失败
    if ( $result !== false) {
    // 再检查http响应码是否为200
    }

    方法一无论图片在不在都是返回FALSE;
    方法二windows下可行,LINUX下无论图片在不在都返加TRUE;
    方法三应该是最合适的
    另外:用get_headers() 方法存在效率问题,建议不使用作为此解决方案

    fsockopen版:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
         $info = parse_url ( $url );
         $fp = fsockopen ( $info [ 'host' ], 80, $errno , $errstr , 30);
         fputs ( $fp , "GET {$info['path']} HTTP/1.1 " );
         fputs ( $fp , "Host: {$info['host']} " );
         fputs ( $fp , "Connection: close " );
         $headers = array ();
         while (! feof ( $fp )) {
         $line = fgets ( $fp );
         if ( $line != " " ) {
         $headers [] = $line ;
         } else {
         break ;
         }
         }
     
         echo "<pre>" ;
         print_r( $headers );

    通过http状态码来判断文件是否存在,比如,响应 302,301,404等都为不存在,如果是200,304,等可以视为文件存在。

    fopen()方法:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
       <?php
     
         if ( @ fopen ( $url , 'r' ) )
         {
             echo 'File Exits' ;
         }
         else
         {
             echo 'File Do Not Exits' ;
         }
         ?>

    CURL 方法:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    <?php
         $url2 = 'http://www.test.com/test.jpg' ;
     
         $ch = curl_init();
         $timeout = 10;
         curl_setopt ( $ch , CURLOPT_URL, $url2 );
         curl_setopt( $ch , CURLOPT_HEADER, 1);
         curl_setopt ( $ch , CURLOPT_RETURNTRANSFER, 1);
         curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT, $timeout );
     
         $contents = curl_exec( $ch );
         //echo $contents;
         if (preg_match( "/404/" , $contents )){
             echo '文件不存在' ;
         }
         ?>
  • 相关阅读:
    WAF与IPS的区别总结
    web后门排查与高效分析web日志技巧
    如何做一名好的web安全工程师?
    从“黑掉Github”学Web安全开发
    DNS劫持
    万网上如何将IP和申请的域名绑定
    如何申请网站域名
    什么是域名?什么网站名?什么是URL?
    myeclipse svn 插件去除已经保存的密码方法
    SVN中检出 和 导出 的区别
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3196854.html
Copyright © 2020-2023  润新知