若需檢測遠端網站是否存在、取得 Content-Type、Content-Length、Server、Set-Cookie 等回應標頭,PHP 內建 fopen() 配合 $http_response_header 或 stream_get_meta_data() 即可輕鬆完成,無需 cURL 擴充。
<?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 ...
<?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_header | stream_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 (預設開啟,共享主機常關閉)。curl_exec + curl_getinfo) 或 Guzzle 等 HTTP Client 函式庫。善用內建功能快速除錯,複雜場景再引入重工具。