(转载)PHP检测远端文件是否存在

admin 发表于 [PHP] 分类,标签: 编程技巧 HTTP PHP代码 PHP自定义函数 知识总结
0

今天在vB·流水帐的博客上看到这篇文章,让我有所斩获,因为以前也曾为这个问题而困惑,特转载收藏。

以下为转载内容:

<?php
$url = 'http://example.com';
$hander_array = get_headers($url);
if ($header_array[0] == 'HTTP/1.1 200 OK') { echo '文件存在'; }
else { echo '文件不存在'; }

简单解释一下上面的代码。get_headers的作用就是访问一个远程地址,把服务器发送的HTTP头以数组形式返回。而$header[0]则是服务器返回的状态码(如果不出意外的话状态码应该都是第一个返回的)。

要确定一个文件在远端服务器上存在,只需要确定访问这个文件返回的状态码是"HTTP/1.1 200 OK"就行了(当然你也可以判断如果状态码不是"HTTP/1.1 404 Not Found"的话则文件存在,不过总感觉不保险,毕竟还有其他的诸如301,400这类的状态码)。

 

查询了下PHP手册上关于get_headers的解释:

array get_headers ( string $url [, int $format ] )

get_headers() 返回一个数组,包含有服务器响应一个 HTTP 请求所发送的标头。如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息。

如果将可选的 format 参数设为 1,则 get_headers() 会解析相应的信息并设定数组的键名。

Note :

自 PHP 5.1.3 起本函数使用默认的流上下文,其可以用 stream_context_get_default() 函数设定和修改。

 

Example #1 get_headers() 例子

<?php
$url 
'http://www.example.com' ;

print_r ( get_headers ( $url ));

print_r ( get_headers ( $url 1 ));
?>

以上例程的输出类似于:

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Sat, 29 May 2004 12:28:13 GMT
    [2] => Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
    [4] => ETag: "3f80f-1b6-3e1cb03b"
    [5] => Accept-Ranges: bytes
    [6] => Content-Length: 438
    [7] => Connection: close
    [8] => Content-Type: text/html
)

Array
(
    [0] => HTTP/1.1 200 OK
    [Date] => Sat, 29 May 2004 12:28:14 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)

请注意, get_headers ** 跟随 重定向 **( HTTP重定向 )。 如果 $format=0 新的报头 将被追加 到数组 如果 $format= 1 多余的报头 将作为是一个包含有 多个重定向值 的数组

例如:

<?php
$url
= 'http://google.com ' ;
var_dump ( get_headers ( $url , 0 ));
array(
18 ) {
  [
0 ]=>  string ( 30 ) "HTTP/1.0 301 Moved Permanently"
 
[ 1 ]=>  string ( 32 ) "Location: http://www.google.com/ "
 
[ 2 ]=>  string ( 38 ) "Content-Type: text/html; charset=UTF-8"
 
[ 3 ]=>  string ( 35 ) "Date: Sun, 26 Sep 2010 00:59:50 GMT"
 
[ 4 ]=>  string ( 38 ) "Expires: Tue, 26 Oct 2010 00:59:50 GMT"
 
[ 5 ]=>  string ( 38 ) "Cache-Control: public, max-age=2592000"
....
 
string ( 15 ) "HTTP/1.0 200 OK"
 
[ 10 ]=>  string ( 35 ) "Date: Sun, 26 Sep 2010 00:59:51 GMT"
 
[ 11 ]=>  string ( 11 ) "Expires: -1"
 
[ 12 ]=>  string ( 33 ) "Cache-Control: private, max-age=0"
.....
}

/*===========================*/

var_dump ( get_headers ( $url , 1 ));
array(
11 ) {
  [
0 ]=>
 
string ( 30 ) "HTTP/1.0 301 Moved Permanently"
 
[ "Location" ]=>  string ( 22 ) "http://www.google.com/ "
 
[ "Content-Type" ]=>  array( 2 ) {
    [
0 ]=>    string ( 24 ) "text/html; charset=UTF-8"
   
[ 1 ]=>    string ( 29 ) "text/html; charset=ISO-8859-1"
 
}
  [
"Date" ]=>  array( 2 ) {
    [
0 ]=>    string ( 29 ) "Sun, 26 Sep 2010 01:03:39 GMT"
   
[ 1 ]=>    string ( 29 ) "Sun, 26 Sep 2010 01:03:39 GMT"
 
}
  [
"Expires" ]=>  array( 2 ) {
    [
0 ]=>    string ( 29 ) "Tue, 26 Oct 2010 01:03:39 GMT"
   
[ 1 ]=>    string ( 2 ) "-1"
 
}
  [
"Cache-Control" ]=>  array( 2 ) {
    [
0 ]=>    string ( 23 ) "public, max-age=2592000"
   
[ 1 ]=>    string ( 18 ) "private, max-age=0"
 
}
.....
}

获取三位HTTP响应码的例子:

<?php
function get_http_response_code($theURL) {
    $headers = get_headers($theURL);
    return substr($headers[0], 9, 3);
}
?>

排除重定向的例子:

<?php
/**
 * Fetches all the real headers sent by the server in response to a HTTP request without redirects
 * 获取不包含重定向的报头
 */

function get_real_headers($url,$format=0,$follow_redirect=0) {
  if (!$follow_redirect) {
    //set new default options
    $opts = array('http' =>
        array('max_redirects'=>1,'ignore_errors'=>1)
    );
    stream_context_get_default($opts);
  }
  //get headers
    $headers=get_headers($url,$format);
    //restore default options
  if (isset($opts)) {
    $opts = array('http' =>
        array('max_redirects'=>20,'ignore_errors'=>0)
    );
    stream_context_get_default($opts);
  }
  //return
    return $headers;
}
?>

发表我的评论