PHP Conference Nagoya 2025

Opciones de contexto de HTTP

Opciones de contexto de HTTPListado de opciones de contexto de HTTP

Descripción

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

Opciones

method string

GET, POST, o cualquier otro método HTTP que admita el servidor remoto.

Por omisión, GET.

header string

Las cabeceras adicionales que se envían en la petición. Los valores de esta opción sobrescribirán los existentes (tales como User-agent:, Host:, o Authentication:).

user_agent string

Valor de la cabecera User-Agent:. Solo se utilizará si el agente no se ha especificado en la opción de contexto header vista arriba.

Por omisión, se utiliza el valor del ajuste user_agent de php.ini.

content string

Datos adicionales a enviar tras las cabeceras. Típicamente se utiliza con peticiones POST o PUT.

proxy string

El URI que define la dirección de un servidor proxy (p.ej. tcp://proxy.example.com:5100).

request_fulluri boolean

Cuando se establece a true, se utilizará todo el URI para construir la petición, (es decir, GET http://www.example.com/path/to/file.html HTTP/1.0). A pesar de que es un formato de petición no estándar, algunos servidores proxy requieren que sea así.

Por omisión es false.

follow_location integer

Seguir las redirecciones de las cabeceras Location. Establecer a 0 para deshabilitarlo.

Por omisión es 1.

max_redirects integer

El número máximo de redirecciones a seguir. Un valor igual o menor a 1 indica que no se siga ninguna redirección.

Por omisión es 20.

protocol_version float

La versión del protocolo HTTP.

Por omisión es 1.0.

Nota:

Las versiónes de PHP anteriores a la 5.3.0 no implementan la decodificación de transferencias fragmentadas. Si este valor es 1.1, es responsabilidad del programador cumplir con la versión 1.1.

timeout float

El tiempo de espera de lectura en segundos, especificado por un float (p.ej. 10.5).

Por omisión, se utiliza el valor del ajuste default_socket_timeout de php.ini.

ignore_errors boolean

Obtener el contenido incluso con códigos de estado de error.

Por omisión es false.

Historial de cambios

Versión Descripción
5.3.4 Se añadió follow_location.
5.3.0 La opción protocol_version admite la decodificación de transferencias fragmentadas en caso de valer 1.1.
5.2.10 Se añadió ignore_errors.
5.2.10 El parámetro header ahora puede ser un array de índices numéricos.
5.2.1 Se añadió timeout.
5.1.0 Se añadió el soporte de HTTPS mediante proxies HTTP.
5.1.0 Se añadió max_redirects.
5.1.0 Se añadió protocol_version.

Ejemplos

Ejemplo #1 Obtener una página y enviar datos POST

<?php

$datos_post
= http_build_query(
array(
'var1' => 'contenido',
'var2' => 'doh'
)
);

$opciones = array('http' =>
array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $datos_post
)
);

$contexto = stream_context_create($opciones);

$resultado = file_get_contents('http://example.com/submit.php', false, $contexto);

?>

Ejemplo #2 Ignorar las redirecciones, aunque obtener las cabeceras y el contenido

<?php

$url
= "http://www.example.org/header.php";

$opciones = array('http' =>
array(
'method' => 'GET',
'max_redirects' => '0',
'ignore_errors' => '1'
)
);

$contexto = stream_context_create($opciones);
$flujo = fopen($url, 'r', false, $contexto);

// información de cabeceras y meta datos
// sobre el flujo
var_dump(stream_get_meta_data($flujo));

// datos reales en $url
var_dump(stream_get_contents($flujo));
fclose($flujo);
?>

Notas

Nota: Opciones de contexto del flujo de socket subyacente
Se pueden admitir opciones de contexto adicionales mediante el transporte subyacente. Para flujos http://, deben consultarse las opciones de contexto del transporte tcp://. Para flujos https://, deben consultarse las opciones de contexto del transporte ssl://.

Nota: Línea de estado HTTP
Cuando esta envultura de flujo sigue una redirección, los datos en wrapper_data devueltos por stream_get_meta_data() podrían no contener necesariamente la línea de estado HTTP que realmente se aplica a los datos del contenido del índice 0.

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',
    ...
La primera petición devolvió un 301 (redirección permanente), de manera que la envoltura del flujo sigue automáticamente la redirección para obtener una respuesta de código 200 (índice = 4).

add a note

User Contributed Notes 11 notes

up
33
nate
10 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
17
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
18
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
6
ASchmidt at Anamera dot net
3 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
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
13 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
4 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
9 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
10 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 );
?>
To Top