©
This document uses PHP Chinese website manual Release
HTTP context 选项 — HTTP context 的选项列表
提供给 http:// 和 https:// 传输协议的 context 选项。 transports.
版本 | 说明 |
---|---|
5.3.4 |
添加 follow_location 。
|
5.3.0 |
当 protocol_version 设置为 1.1 时支持分块传输解码。
|
5.2.10 |
添加 ignore_errors 。
|
5.2.10 | header 现在可以是一个数字索引的 array 。
|
5.2.1 |
添加 timeout 。
|
5.1.0 | Added HTTPS proxying through HTTP proxies. 添加经由 HTTP 代理的 HTTPS 代理。 |
5.1.0 |
添加 max_redirects 。
|
5.1.0 |
添加 protocol_version 。
|
Example #1 获取一个页面并发送 POST 数据
<?php
$postdata = http_build_query (
array(
'var1' => 'some content' ,
'var2' => 'doh'
)
);
$opts = array( 'http' =>
array(
'method' => 'POST' ,
'header' => 'Content-type: application/x-www-form-urlencoded' ,
'content' => $postdata
)
);
$context = stream_context_create ( $opts );
$result = file_get_contents ( 'http://example.com/submit.php' , false , $context );
?>
Example #2 忽略重定向并获取 header 和内容
<?php
$url = "http://www.example.org/header.php" ;
$opts = array( 'http' =>
array(
'method' => 'GET' ,
'max_redirects' => '0' ,
'ignore_errors' => '1'
)
);
$context = stream_context_create ( $opts );
$stream = fopen ( $url , 'r' , false , $context );
// header information as well as meta data
// about the stream
var_dump ( stream_get_meta_data ( $stream ));
// actual data at $url
var_dump ( stream_get_contents ( $stream ));
fclose ( $stream );
?>
Note: Underlying socket stream context options
Additional context options may be supported by the underlying transport For http:// streams, refer to context options for the tcp:// transport. For https:// streams, refer to context options for the ssl:// transport.
Note: HTTP status line
When this stream wrapper follows a redirect, the wrapper_data returned by stream_get_meta_data() might not necessarily contain the HTTP status line that actually applies to the content data at index 0.The first request returned a 301 (permanent redirect), so the stream wrapper automatically followed the redirect to get a 200 response (index = 4).array ( 'wrapper_data' => array ( 0 => 'HTTP/1.0 301 Moved Permantenly', 1 => 'Cache-Control: no-cache', 2 => 'Connection: close', 3 => 'Location: http://example.com/foo.jpg', 4 => 'HTTP/1.1 200 OK', ...
[#1] jay [2015-04-14 01:32:45]
Remember to match content with Content-type:
<?php
$data = array(
'var1' => 'some content',
'var2' => 'doh'
);
$opts = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/json', // here...
'content' => json_encode($data) // and here.
)
);
. . .
?>
[#2] nate [2014-04-17 03:19:36]
Note that if you set the protocol_version option to 1.1 and the server you are requesting from is configured to use keep-alive connections, the function (fopen, file_get_contents, etc.) will "be slow" and take a long time to complete. This is a feature of the HTTP 1.1 protocol you are unlikely to use with stream contexts in PHP.
Simply add a "Connection: close" header to the request to eliminate the keep-alive timeout:
<?php
// php 5.4 : array syntax and header option with array value
$data = file_get_contents('http://www.example.com/', null, stream_context_create([
'http' => [
'protocol_version' => 1.1,
'header' => [
'Connection: close',
],
],
]));
?>
[#3] chris [2014-02-06 06:14:06]
I had quite a bit of trouble trying to make a request with fopen through a proxy to a secure url. I kept getting a 400 Bad Request back from the remote host. It was receiving the proxy url as the SNI host. In order to get around this I had to explicity set the SNI host to the domain I was trying to reach. It's apparently the issue outlined in this bug:
https://bugs.php.net/bug.php?id=63519
<?php
$domain = parse_url($file, PHP_URL_HOST);
$proxy_string = "tcp://" . WP_PROXY_HOST . ":" . WP_PROXY_PORT;
$opts = array(
'http' => array( 'proxy' => $proxy_string ),
'ssl' => array( 'SNI_enabled' => true, 'SNI_server_name' => $domain));
$context = stream_context_create($opts);
$handle = fopen( $file, 'r', false, $context );
?>
[#4] vchampion at gmail dot com [2012-10-23 13:41:30]
If you use the proxy server and encounter an error "fopen(http://example.com): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request" note that in many situations you need also set the parameter "request_fulluri" to "true" in your stream options. Without this option the php script sends the empty request to the server as "GET / HTTP/0.0" and the proxy server replies to it with the "HTTP 400" error.
For example (working sample):
<?php
$stream = stream_context_create(Array("http" => Array("method" => "GET",
"timeout" => 20,
"header" => "User-agent: Myagent",
"proxy" => "tcp://my-proxy.localnet:3128",
'request_fulluri' => True
)));
if ( $fp = fopen("http://example.com", 'r', false, $stream) ) {
print "well done";
}
?>
P>S> PHP 5.3.17
[#5] gourav sarkar [2011-01-18 20:09:38]
watch your case when using methods (POST and GET)...it must be always uppercase. in case of you write it in lower case it wont work.
[#6] TxRx [2009-12-15 09:13:55]
Note that if the server is not able to 'getaddresses' change the name to an ip address and that'll sort that out for internal looking calls and posts.