我想將超文本傳輸協議的HEAD命令發送到PHP中的服務器來檢索標題,但不是內容或URL。我如何以有效的方式做到這一點?在PHP中使用HTTP的HEAD命令最簡單的方法是什麼?
可能最常見的用例是檢查死鏈接。爲此,我只需要HTTP請求的回覆代碼,而不是頁面內容。 使用file_get_contents("http://...")
可以很容易地使用PHP獲取網頁,但是爲了檢查鏈接,這實際上是效率低下的,因爲它會下載整個頁面內容/圖像/無論如何。
我想將超文本傳輸協議的HEAD命令發送到PHP中的服務器來檢索標題,但不是內容或URL。我如何以有效的方式做到這一點?在PHP中使用HTTP的HEAD命令最簡單的方法是什麼?
可能最常見的用例是檢查死鏈接。爲此,我只需要HTTP請求的回覆代碼,而不是頁面內容。 使用file_get_contents("http://...")
可以很容易地使用PHP獲取網頁,但是爲了檢查鏈接,這實際上是效率低下的,因爲它會下載整個頁面內容/圖像/無論如何。
作爲替代捲曲可以使用HTTP上下文選項設置請求方法到HEAD
。然後用這些選項打開一個(http wrapper)流並獲取元數據。
$context = stream_context_create(array('http' =>array('method'=>'HEAD')));
$fd = fopen('http://php.net', 'rb', false, $context);
var_dump(stream_get_meta_data($fd));
fclose($fd);
還看到:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http
你可以用cURL整齊地做到這一點:
<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
// This changes the request method to HEAD
curl_setopt($ch, CURLOPT_NOBODY, true);
// grab URL and pass it to the browser
curl_exec($ch);
// Edit: Fetch the HTTP-code (cred: @GZipp)
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// close cURL resource, and free up system resources
curl_close($ch);
比捲曲甚至更容易 - 只需使用PHP get_headers()
函數返回您指定的任何網址都頭信息的數組。另一個真正簡單的檢查遠程文件存在的方法是使用fopen()
並嘗試以讀取模式打開URL(您需要爲此啓用allow_url_fopen)。
查看這些函數的PHP手冊,它都在那裏。
'get_headers()'實際上會發送一個'GET'請求,除非你先這樣做:'stream_context_set_default(array('http'=>陣列( '方法'=> 'HEAD')));' – Octopus 2017-06-01 03:02:08
我比較喜歡使用curl的解決方案,因爲我喜歡使用內置函數。也許別人可以評論每種可能性的表現嗎? – fuenfundachtzig 2009-10-23 10:30:26
請注意,這會爲'401'響應代碼引發錯誤,而curl會爲您提供實際響應。 – 2015-12-14 11:06:27
'stream_context_create()'也可以用於'file_get_contents()'。也許'get_headers()'更好地與'stream_context_set_default()'結合起來,請求到
HEAD
的請求方法。參見http://php.net/manual/es/function.get-headers.php – cybmeta 2016-02-03 16:56:25