首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 取得遠端伺服器 HTTP 回應標頭:fopen + $http_response_header 或 stream_get_meta_data

     編輯:PHP 綜合知識

若需檢測遠端網站是否存在、取得 Content-Type、Content-Length、Server、Set-Cookie 等回應標頭,PHP 內建 fopen() 配合 $http_response_header 或 stream_get_meta_data() 即可輕鬆完成,無需 cURL 擴充。

方法一:$http_response_header (全域變數)

<?php
$url = 'https://example.com/';
$fp = @fopen($url, 'r');
if ($fp) {
    // $http_response_header 會在 fopen 成功後自動填入
    foreach ($http_response_header as $header) {
        echo $header . "<br>\n";
    }
    fclose($fp);
} else {
    echo "無法開啟 $url";
}
?>

輸出範例:

HTTP/1.1 200 OK
Date: Mon, 01 Jan 2024 00:00:00 GMT
Server: Apache/2.4.58
Content-Type: text/html; charset=UTF-8
Content-Length: 1256
...

方法二:stream_get_meta_data() (結構化陣列)

<?php
$url = 'https://example.com/';
$fp = @fopen($url, 'r');
if ($fp) {
    $meta = stream_get_meta_data($fp);
    // $meta['wrapper_data'] 為標頭陣列
    print_r($meta['wrapper_data']);
    fclose($fp);
}
?>

輸出結構:

Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Mon, 01 Jan 2024 00:00:00 GMT
    [2] => Server: Apache/2.4.58
    [3] => Content-Type: text/html; charset=UTF-8
    ...
)

比較與適用場景

特性$http_response_headerstream_get_meta_data()
資料型態字串陣列關聯陣列 (含 wrapper_data、stream_type、mode、seekable 等)
取得時機fopen 成功後立即可用需額外呼叫函式
適用場景快速列印/簡單遍歷需結構化處理、同時取得流屬性
注意事項全域變數,僅在當前作用域有效較完整,包含流狀態資訊

進階:解析標頭為關聯陣列

<?php
function parseResponseHeaders(array $rawHeaders): array {
    $headers = [];
    foreach ($rawHeaders as $h) {
        if (strpos($h, ':') !== false) {
            [$key, $value] = explode(':', $h, 2);
            $key = strtolower(trim($key));
            $headers[$key] = trim($value);
        } else {
            // 狀態行 HTTP/1.1 200 OK
            $headers['status'] = $h;
        }
    }
    return $headers;
}

$fp = @fopen('https://example.com/', 'r');
if ($fp) {
    $parsed = parseResponseHeaders($http_response_header);
    echo "Server: {$parsed['server'] ?? 'Unknown'}<br>";
    echo "Content-Type: {$parsed['content-type'] ?? 'Unknown'}<br>";
    fclose($fp);
}
?>

限制與替代方案

  • allow_url_fopen 必須為 On (預設開啟,共享主機常關閉)。
  • 僅支援 HTTP/HTTPS 協定,無法精細控制連線逾時、SSL 驗證、Proxy、重導向追蹤等。
  • 大檔案/高併發/複雜需求請改用 cURL (curl_exec + curl_getinfo) 或 Guzzle 等 HTTP Client 函式庫。

善用內建功能快速除錯,複雜場景再引入重工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved