PHP file_get_content()和设置请求头

使用 PHP,是否可以使用 file_get_contents()发送 HTTP 报头?

我知道你可以从你的 php.ini文件发送用户代理。但是,您是否也可以使用 file_get_contents()发送其他信息,如 HTTP_ACCEPTHTTP_ACCEPT_LANGUAGEHTTP_CONNECTION

还是有其他功能可以实现这一点?

220663 次浏览

不幸的是,看起来 file_get_contents()并没有提供那种程度的控制。CURL 扩展通常是最先出现的,但是对于非常简单和直接的 HTTP 请求,我强烈推荐使用 PECL _ HTTP 扩展(http://pecl.php.net/package/pecl_http)。(使用它比使用 cURL 容易得多)

使用 php cURL 库可能是正确的方法,因为这个库比简单的 file_get_contents(...)具有更多的特性。

举个例子:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');


curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>

事实上,在进一步阅读 file_get_contents()函数之后:

// Create a stream
$opts = [
"http" => [
"method" => "GET",
"header" => "Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
]
];


// DOCS: https://www.php.net/manual/en/function.stream-context-create.php
$context = stream_context_create($opts);


// Open the file using the HTTP headers set above
// DOCS: https://www.php.net/manual/en/function.file-get-contents.php
$file = file_get_contents('http://www.example.com/', false, $context);

你也许能够遵循这种模式来实现你所寻求的,我还没有亲自测试过这一点。(如果它不起作用,请随意查看我的其他答案)

如果您不需要 HTTPS,并且 curl 在您的系统上不可用,那么您可以使用 fsockopen

这个函数打开一个连接,您可以从中读取和写入,就像使用普通的文件句柄一样。

是的。

在 URL 上调用 file_get_contents时,应该使用 stream_create_context函数,php.net 上有相当详细的文档说明。

在下面的 php.net 页面的用户评论部分或多或少正好讨论了这个问题: http://php.net/manual/en/function.stream-context-create.php

可以使用此变量在 file_get_contents()函数之后检索响应标头。

密码:

  file_get_contents("http://example.com");
var_dump($http_response_header);

产出:

array(9) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
[2]=>
string(29) "Server: Apache/2.2.3 (CentOS)"
[3]=>
string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
[4]=>
string(27) "ETag: "280100-1b6-80bfd280""
[5]=>
string(20) "Accept-Ranges: bytes"
[6]=>
string(19) "Content-Length: 438"
[7]=>
string(17) "Connection: close"
[8]=>
string(38) "Content-Type: text/html; charset=UTF-8"
}

以下是对我有效的方法(多米尼克只差一行)。

$url = "";


$options = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad
)
);


$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);