可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
With PHP, is it possible to send HTTP headers with file_get_contents()
?
I know you can send the user agent from your php.ini
file. However, can you also send other information such as HTTP_ACCEPT
, HTTP_ACCEPT_LANGUAGE
, and HTTP_CONNECTION
with file_get_contents()
?
Or is there another function that will accomplish this?
回答1:
Actually, upon further reading on the file_get_contents()
function:
// Create a stream
$opts = [
\"http\" => [
\"method\" => \"GET\",
\"header\" => \"Accept-language: en\\r\\n\" .
\"Cookie: foo=bar\\r\\n\"
]
];
$context = stream_context_create($opts);
// Open the file using the HTTP headers set above
$file = file_get_contents(\'http://www.example.com/\', false, $context);
You may be able to follow this pattern to achieve what you are seeking to, I haven\'t personally tested this though. (and if it doesn\'t work, feel free to check out my other answer)
回答2:
Here is what worked for me (Dominic was just one line short).
$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);
回答3:
You can use this variable to retrieve response headers after file_get_contents()
function.
Code:
file_get_contents(\"http://example.com\");
var_dump($http_response_header);
Output:
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\"
}
回答4:
Using the php cURL libraries will probably be the right way to go, as this library has more features than the simple file_get_contents(...)
.
An example:
<?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);
?>
回答5:
Yes.
When calling file_get_contents on a url, one should use the stream_create_context function, which is fairly well documented on php.net
This is more or less exactly covered on the following page at php.net in the user comments section: http://php.net/manual/en/function.stream-context-create.php
回答6:
If you don\'t need HTTPS and curl is not available on your system you could use fsockopen
This function opens a connection from which you can both read and write like you would do with a normal file handle.
回答7:
Unfortunately, it doesn\'t look like file_get_contents()
really offers that degree of control. The cURL extension is usually the first to come up, but I would highly recommend the PECL_HTTP extension (http://pecl.php.net/package/pecl_http) for very simple and straightforward HTTP requests. (it\'s much easier to work with than cURL)