PHP利用get_headers()函數判斷遠程的url地址是否有效

問題:

利用url訪問遠程的文件、圖片、視頻時有時須要請求前判斷url地址是否有效。php

解決辦法:

(PHP 5, PHP 7)html

get_headers — 取得服務器響應一個 HTTP 請求所發送的全部標頭。chrome

利用PHP自帶的函數get_headers(),利用http返回值是否存在200狀態,來判斷url地址是否有效。數組

get_headers()函數官方介紹:http://php.net/manual/zh/function.get-headers.php服務器

具體實現代碼以下:

案例一:dom

$url = "https://www.baidu.com";
$response = get_headers($url);
echo "<pre>";
var_dump($response);
$response = get_headers($url,1);//若是將可選的 format 參數設爲 1,則 get_headers() 會解析相應的信息並設定數組的鍵名。
echo '<pre>';
var_dump($response);

打印結果以下:函數

array(16) {
  [0]=>string(15) "HTTP/1.0 200 OK"
  [1]=>string(20) "Accept-Ranges: bytes"
  [2]=>string(23) "Cache-Control: no-cache"
  [3]=>string(21) "Content-Length: 14722"
  [4]=>string(23) "Content-Type: text/html"
  [5]=>string(35) "Date: Wed, 20 Feb 2019 13:12:31 GMT"
  [6]=>string(21) "Etag: "5c653bc8-3982""
  [7]=>string(44) "Last-Modified: Thu, 14 Feb 2019 09:58:32 GMT"
  [8]=>string(39) "P3p: CP=" OTI DSP COR IVA OUR IND COM ""
  [9]=>string(16) "Pragma: no-cache"
  [10]=>string(15) "Server: BWS/1.1"
  [11]=>string(141) "Set-Cookie: BAIDUID=72E4B8623F9E998C790B22F8E8D64BEC:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com"
  [12]=>string(137) "Set-Cookie: BIDUPSID=72E4B8623F9E998C790B22F8E8D64BEC; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com"
  [13]=>string(111) "Set-Cookie: PSTM=1550668351; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com"
  [14]=>string(21) "Vary: Accept-Encoding"
  [15]=>string(33) "X-Ua-Compatible: IE=Edge,chrome=1"
}
array(14) { [0]=>string(15) "HTTP/1.0 200 OK" ["Accept-Ranges"]=>string(5) "bytes" ["Cache-Control"]=>string(8) "no-cache" ["Content-Length"]=>string(5) "14722" ["Content-Type"]=>string(9) "text/html" ["Date"]=>string(29) "Wed, 20 Feb 2019 13:12:31 GMT" ["Etag"]=>string(15) ""5c653bc8-3982"" ["Last-Modified"]=>string(29) "Thu, 14 Feb 2019 09:58:32 GMT" ["P3p"]=>string(34) "CP=" OTI DSP COR IVA OUR IND COM "" ["Pragma"]=>string(8) "no-cache" ["Server"]=>string(7) "BWS/1.1" ["Set-Cookie"]=>array(3) { [0]=>string(129) "BAIDUID=72E4B8623F9E998CF68FDDAD465EAF4A:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com" [1]=>string(125) "BIDUPSID=72E4B8623F9E998CF68FDDAD465EAF4A; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com" [2]=>string(99) "PSTM=1550668351; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com" } ["Vary"]=>string(15) "Accept-Encoding" ["X-Ua-Compatible"]=>string(16) "IE=Edge,chrome=1" }

 案例二:url

$url = "https://www.baidu.com";
$response = get_headers($url);
if(preg_match('/200/',$response[0])){ 
    echo "<pre/>"; 
    var_dump($response[0]); 
}else{ 
   var_dump("無效url資源!"); 
}

打印結果以下:spa

string(15) "HTTP/1.0 200 OK"

 注意點:若是提示錯誤,須要在php.ini開啓:allow_url_fopen=on.net

遇到get_headers()請求https報錯解決思路

場景:使用get_headers()去校驗該https類型的url是否能正確響應時

結果報錯,以下:

get_headers(): SSL operation failed with code 1. 
OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

具體緣由:
get_headers()會對url發出請求HTTP請求,獲取服務器響應頭信息,遇到url爲https時,會去校驗簽名證書

解決思路:
關閉證書校驗

具體實現代碼以下:

$url = "https://www.baidu.com";

//關閉https證書校驗
stream_context_set_default( [
    'ssl' => [
        'verify_host' => false,
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]);

$response = get_headers($url);
if(preg_match('/200/',$response[0])){ 
    echo "<pre/>"; 
    var_dump($response[0]); 
}else{ 
   var_dump("無效url資源!"); 
}
相關文章
相關標籤/搜索