PHP 7.2.0 Beta 3 Released

HTTP context options

HTTP context optionsHTTP context option listing


Context options for http:// and https:// transports.


method string

GET, POST, or any other HTTP method supported by the remote server.

Defaults to GET.

header array or string

Additional headers to be sent during request. Values in this option will override other values (such as User-agent:, Host:, and Authentication:).

user_agent string

Value to send with User-Agent: header. This value will only be used if user-agent is not specified in the header context option above.

By default the user_agent php.ini setting is used.

content string

Additional data to be sent after the headers. Typically used with POST or PUT requests.

proxy string

URI specifying address of proxy server. (e.g. tcp://

request_fulluri boolean

When set to TRUE, the entire URI will be used when constructing the request. (i.e. GET HTTP/1.0). While this is a non-standard request format, some proxy servers require it.

Defaults to FALSE.

follow_location integer

Follow Location header redirects. Set to 0 to disable.

Defaults to 1.

max_redirects integer

The max number of redirects to follow. Value 1 or less means that no redirects are followed.

Defaults to 20.

protocol_version float

HTTP protocol version.

Defaults to 1.0.


PHP prior to 5.3.0 does not implement chunked transfer decoding. If this value is set to 1.1 it is your responsibility to be 1.1 compliant.

timeout float

Read timeout in seconds, specified by a float (e.g. 10.5).

By default the default_socket_timeout php.ini setting is used.

ignore_errors boolean

Fetch the content even on failure status codes.

Defaults to FALSE.


Version Description
5.3.4 Added follow_location.
5.3.0 The protocol_version supports chunked transfer decoding when set to 1.1.
5.2.10 Added ignore_errors.
5.2.10 The header can now be an numerically indexed array.
5.2.1 Added timeout.
5.1.0 Added HTTPS proxying through HTTP proxies.
5.1.0 Added max_redirects.
5.1.0 Added protocol_version.


Example #1 Fetch a page and send POST data


'var1' => 'some content',
'var2' => 'doh'

$opts = array('http' =>
'method'  => 'POST',
'header'  => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata

$context stream_context_create($opts);

$result file_get_contents(''false$context);


Example #2 Ignore redirects but fetch headers and content



$opts = array('http' =>
'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

// actual data at $url


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.

array (
  'wrapper_data' =>
  array (
    0 => 'HTTP/1.0 301 Moved Permantenly',
    1 => 'Cache-Control: no-cache',
    2 => 'Connection: close',
    3 => 'Location:',
    4 => 'HTTP/1.1 200 OK',
The first request returned a 301 (permanent redirect), so the stream wrapper automatically followed the redirect to get a 200 response (index = 4).

add a note add a note

User Contributed Notes 6 notes

3 years ago
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 5.4 : array syntax and header option with array value
$data = file_get_contents('', null, stream_context_create([
'http' => [
'protocol_version' => 1.1,
'header'           => [
'Connection: close',
vchampion at gmail dot com
4 years ago
If you use the proxy server and encounter an error "fopen( 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):
= stream_context_create(Array("http" => Array("method"  => "GET",
"timeout" => 20,
"header"  => "User-agent: Myagent",
"proxy"   => "tcp://my-proxy.localnet:3128",
'request_fulluri' => True /* without this option we get an HTTP error! */

if (
$fp = fopen("", 'r', false, $stream) ) {
"well done";

P>S> PHP 5.3.17
2 years ago
Remember to match content with Content-type:


= array(
'var1' => 'some content',
'var2' => 'doh'

$opts = array('http' =>
'method'  => 'POST',
'header'  => 'Content-type: application/json'// here...
'content' => json_encode($data// and here.

. . .

gourav sarkar
6 years ago
watch your case when using methods (POST and GET) must be always uppercase. in case of you write it in lower case it wont work.
3 years ago
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:

= 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 );
ywarnier at beeznest dot org
15 days ago
Note that setting request_fulluri to true will *change* the value of $_SERVER['REQUEST_URI] on the receiving end (from /abc.php to
To Top