14

我想将超文本传输​​协议的 HEAD 命令发送到 PHP 中的服务器以检索标头,而不是内容或 URL。我如何以有效的方式做到这一点?

可能最常见的用例是检查死链接。为此,我只需要 HTTP 请求的回复代码,而不需要页面内容。在 PHP 中获取网页可以使用 轻松完成file_get_contents("http://..."),但是为了检查链接,这确实是低效的,因为它会下载整个页面内容/图像/任何内容。

4

5 回答 5

23

您可以使用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);
于 2009-10-09T18:46:30.243 回答
21

作为 curl 的替代方法,您可以使用 http 上下文选项将请求方法设置为HEAD. 然后使用这些选项打开一个(http 包装器)流并获取元数据。

$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

于 2009-10-09T20:48:26.987 回答
5

甚至比 curl 更简单 - 只需使用 PHPget_headers()函数,它会为您指定的任何 URL 返回一个包含所有标题信息的数组。另一种检查远程文件是否存在的真正简单方法是使用fopen()并尝试以读取模式打开 URL(您需要为此启用 allow_url_fopen)。

只需查看这些函数的 PHP 手册,它就在那里。

于 2009-10-10T07:04:31.783 回答
2

梨好像有它:

http://pear.php.net/manual/en/package.http.http.head.php

于 2009-10-09T18:47:52.633 回答
0

使用可以使用Guzzle Client,它使用 CURL 库但更简单优化

安装:

composer require guzzlehttp/guzzle

你的例子:

// create guzzle object
$client = new \GuzzleHttp\Client();

// send request
$response = $client->head("https://example.com");

// extract headers from response
$headers = $response->getHeaders();

快速简单。

在这里阅读更多

于 2020-01-01T06:14:41.527 回答