Opciones de contexto HTTP

Opciones de contexto HTTPLista de opciones de contexto HTTP

Descripción

Opciones de contexto para los protocolos http:// y https://.

Opciones

method string

GET, POST, o cualquier otro método HTTP soportado por el servidor remoto.

Por omisión, vale GET.

header array o string

Encabezados adicionales a enviar durante la petición. Los valores de esta opción sobrescribirán los otros valores (como User-agent:, Host:, y Authentication:), incluso al seguir las redirecciones Location:. Por lo tanto, no se recomienda definir el encabezado Host:, si follow_location está activado.

Una cadena de caracteres debe contener pares Clave : valor delimitados por \r\n, por ejemplo : "Content-Type: application/json\r\nConnection: close". Un array debe contener una lista de pares Clave : valor, por ejemplo : ["Content-Type: application/json", "Connection: close"].

user_agent string

Valor a enviar con el encabezado User-Agent:. Este valor no debe ser utilizado si el agente de usuario no está especificado en la opción de contexto header arriba mencionada.

Por omisión, se utilizará el valor de la opción de configuración user_agent del fichero php.ini.

content string

Los datos adicionales a enviar después de los encabezados. Típicamente utilizados durante las peticiones POST o PUT.

proxy string

URI de la dirección del proxy (e.g. tcp://proxy.example.com:5100).

request_fulluri bool

Cuando se establece en true, se utilizará la URI completa durante la construcción de la petición (e.g. GET http://www.example.com/path/to/file.html HTTP/1.0). Aunque este formato de petición no sea estándar, algunos servidores de proxy lo requieren.

Por omisión, vale false.

follow_location int

Sigue las redirecciones Location. Establecer en 0 para desactivar.

Por omisión, vale 1.

max_redirects int

El número máximo de redirecciones a seguir. El valor 1 o inferior significa que ninguna redirección será seguida.

Por omisión, vale 20.

protocol_version float

Versión del protocolo HTTP.

Por omisión, vale 1.1 a partir de PHP 8.0.0; anterior a esta versión el valor por omisión era 1.0.

timeout float

Tiempo máximo de espera para la lectura, en forma de un float (e.g. 10.5).

Por omisión, se utilizará el valor de la opción de configuración default_socket_timeout del fichero php.ini.

ignore_errors bool

Recupera el contenido incluso al recibir un código de fallo.

Por omisión, vale false.

Ejemplos

Ejemplo #1 Recuperación de una página y envío de datos POST

<?php

$postdata
= http_build_query(
array(
'var1' => 'contenido',
'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);

?>

Ejemplo #2 Ignora las redirecciones pero recupera los encabezados y el contenido

<?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);

// información sobre los encabezados y metadatos del flujo
var_dump(stream_get_meta_data($stream));

// datos actuales de $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>

Notas

Nota: Opciones de contexto del flujo subyacente
Opciones de contexto adicionales pueden ser soportadas por el transporte subyacente. Para los flujos http://, refiérase a las opciones de contexto del transporte tcp://. Para los flujos https://, refiérase a las opciones de contexto del transporte ssl://.

Nota: Línea de estado HTTP
Cuando este gestor de flujo sigue una redirección, wrapper_data, devuelto por la función stream_get_meta_data() no debe contener obligatoriamente la línea de estado HTTP que se aplica a los datos de contenido en el índice 0.

array (
  'wrapper_data' =>
  array (
    0 => 'HTTP/1.0 301 Moved Permanently',
    1 => 'Cache-Control: no-cache',
    2 => 'Connection: close',
    3 => 'Location: http://example.com/foo.jpg',
    4 => 'HTTP/1.1 200 OK',
    ...
La primera petición devuelve una 301 (redirección permanente), por lo tanto, el gestor de flujo sigue automáticamente la redirección para obtener una respuesta 200 (índice = 4).

add a note

User Contributed Notes 12 notes

up
33
nate
11 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
// 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',
],
],
]));
?>
up
18
daniel dot peder at gmail dot com
7 years ago
note that for both http and https protocols require the same 'http' context keyword:

<?php

// CORRECT example:
// this will work as expected
// note the url with https but context with http
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('http' => array(...))));

// INVALID example:
// this will not work, the context will be ignored
// note the url with https also context with https
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('https' => array(...))));
up
6
ASchmidt at Anamera dot net
4 years ago
With the default of

'follow_location' => 1

be certain NEVER include a "Host:" header in the 'header' array.

If the host is set to "mydomain.com", and that web site has a (quite common) redirect to "www.mydomain.com", then the initial request to "http://mydomain.com" will get the expected response of:

HTTP/1.1 301 Moved Permanently
Location: http://www.mydomain.com/

However, the follow-up request does NOT replace the original "host" header with the new "location" value, as one would expect. Consequently each "follow-location" request will again be served by the original host of "http://mydomain.com", and continue the redirect loop until 'max_redirects' has been exhausted.

(For details: https://bugs.php.net/bug.php?id=77889)
up
17
daniel.peder (a) gmail.com
7 years ago
note that both http and https transports require the same context name http

// OK example:
// this will work as expected
// note the url with https but context with http
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('http' => array(...))));

// INVALID example:
// this will not work, the context will be ignored
// note the url with https also context with https
$correct_data = file_get_contents('https://example.com', false, stream_context_create(array('https' => array(...))));
up
5
ywarnier at beeznest dot org
7 years ago
Note that setting request_fulluri to true will *change* the value of $_SERVER['REQUEST_URI] on the receiving end (from /abc.php to http://domain.com/abc.php).
up
15
gourav sarkar
14 years ago
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.
up
7
aruntechguy at outlook dot com
7 years ago
If you want to use Basic Auth while using get_headers(), use stream_context options below.

I am using HEAD method here, but please feel free to use GET also.

<?php
$targetUrl
= 'http or https target url here';
$basicAuth = base64_encode('username:password');

stream_context_set_default(
[
'http' => [
'method' => 'HEAD',
'header' => 'Authorization: Basic ' . $basicAuth
]
]
);
$result = get_headers($targetUrl);

print_r($result);
up
2
njt1982 at yahoo dot com
10 months ago
It's worth noting that the `header` array seems to only want an array of strings, not an associative array.

I just spent a chunk of time debugging something not working as expected (no errors though) which was fixed by converting an associative array of headers into a simple array of strings.
up
10
vchampion at gmail dot com
12 years ago
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 /* without this option we get an HTTP error! */
)));

if (
$fp = fopen("http://example.com", 'r', false, $stream) ) {
print
"well done";
}
?>

P>S> PHP 5.3.17
up
7
jay
10 years ago
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.
)
);

. . .

?>
up
4
chris
11 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:

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 );
?>
up
0
bigtree at 29a dot nl
2 months ago
If you pass the 'header' option as a string and you have multiple headers, they must be separated by "\r\n".
To Top