PHP Australia Conference 2015

Opciones de contexto de HTTP

Opciones de contexto de HTTPLista de opciones de contexto de HTTP

Descripción

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

Opciones

method string

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

Por omisión, GET.

header string

Cabeceras adicionales que se envían en la petición. Los valores sobrescribirán los existentes (como por ejemplo User-agent:, Host:, o Authentication:).

user_agent string

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

por omisión se utiliza el valor del ajuste user_agent en php.ini.

content string

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

proxy string

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

request_fulluri boolean

Si vale TRUE, se utilizará toda la 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 FALSE.

follow_location integer

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

Por omisión 1.

max_redirects integer

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 20.

protocol_version float

Versión del protocolo HTTP.

Por omisión 1.0.

Nota:

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

timeout float

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

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

Por omisión FALSE.

Historial de cambios

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

Ejemplos

Ejemplo #1 Captura una página y envía 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 per captura las cabeceras 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 de cabeceras y meta datos
// sobre el flujo
var_dump(stream_get_meta_data($stream));

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

Notas

Nota: Opciones de contexto del flujo de socket subyacente
Hay soporte para opciones de contexto adicionales en 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 sigue una redirección, el wrapper_data devuelto por stream_get_meta_data() no contiene necesariamente la línea de estado HTTP que realmente se aplica al 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 automáticamente sigue la redirección para obtener una respuesta con código 200 (índice = 4).

add a note add a note

User Contributed Notes 5 notes

up
3
nate
5 months 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
4
vchampion at gmail dot com
1 year 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
1
chris
7 months 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
gourav sarkar
3 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
TxRx
4 years ago
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.
To Top