2009-10-09 77 views
8

我想將超文本傳輸​​協議的HEAD命令發送到PHP中的服務器來檢索標題,但不是內容或URL。我如何以有效的方式做到這一點?在PHP中使用HTTP的HEAD命令最簡單的方法是什麼?

可能最常見的用例是檢查死鏈接。爲此,我只需要HTTP請求的回覆代碼,而不是頁面內容。 使用file_get_contents("http://...")可以很容易地使用PHP獲取網頁,但是爲了檢查鏈接,這實際上是效率低下的,因爲它會下載整個頁面內容/圖像/無論如何。

回答

15

作爲替代捲曲可以使用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

+1

我比較喜歡使用curl的解決方案,因爲我喜歡使用內置函數。也許別人可以評論每種可能性的表現嗎? – fuenfundachtzig 2009-10-23 10:30:26

+0

請注意,這會爲'401'響應代碼引發錯誤,而curl會爲您提供實際響應。 – 2015-12-14 11:06:27

+0

'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

17

你可以用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); 
3

比捲曲甚至更容易 - 只需使用PHP get_headers()函數返回您指定的任何網址都頭信息的數組。另一個真正簡單的檢查遠程文件存在的方法是使用fopen()並嘗試以讀取模式打開URL(您需要爲此啓用allow_url_fopen)。

查看這些函數的PHP手冊,它都在那裏。

+1

'get_headers()'實際上會發送一個'GET'請求,除非你先這樣做:'stream_context_set_default(array('http'=>陣列( '方法'=> 'HEAD')));' – Octopus 2017-06-01 03:02:08

相關問題