PHP 8.4.1 Released!

Опції контекста HTTP

Опції контекста HTTPСписок опцій контекста HTTP

Опис

Опції контекста для транспортних протоколів http:// та https://.

Опції

method string

GET, POST, або будь-який інший метод HTTP, що підтримується віддаленим сервером.

Початково - GET.

header string

Додаткові заголовки, що відправляються під час запиту. Значення в цих опціях будуть перевизначати інші опції (такі як User-agent:, Host:, та Authentication:).

user_agent string

Значення для відправки із заголовками User-Agent:. Ці значення будуть використовуватись лише якщо не буде визначено user-agent в опціях контекста header вище.

Початково використовується директива user_agent з файла php.ini.

content string

Додаткові дані для відправки після заголовків. Зазвичай використовується із запитами POST або PUT.

proxy string

Адреса URI, що визначає проксі-сервер. (наприклад tcp://proxy.example.com:5100).

request_fulluri boolean

Якщо встановлено значення в true, то при створенні запиту буде використовуватись повна URI. (наприклад GET http://www.example.com/path/to/file.html HTTP/1.0). Хоча це нестандартний формат запиту, деякі проксі-сервера вимагають його.

Початково false.

follow_location integer

Вказує чи потрібно слідувати переадресаціям заголовку Location. Для відключення встановіть 0.

Початково 1.

max_redirects integer

Максимальна кількість переходів при переадресаціях. Значення 1 або менше, означає переходи без переадресацій.

Початково 20.

protocol_version float

Версія HTTP-протоколу.

Початково 1.0.

Зауваження:

В PHP до версії 5.3.0 не було впроваджено декодування фрагментованих передач. Якщо це значення встановити в 1.1, це означає, що ви берете відповідальність бути сумісним з 1.1.

timeout float

Час очікування для читання в секундах, визначається через float (наприклад 10.5).

Початково використовується значення директиви default_socket_timeout з файлу php.ini.

ignore_errors boolean

Отримувати вміст навіть при неуспішних кодах статуса.

Початково false.

Журнал змін

Версія Опис
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 Додано проксування протоколу HTTPS через HTTP-проксі.
5.1.0 Додано max_redirects.
5.1.0 Додано protocol_version.

Приклади

Приклад #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);

?>

Приклад #2 Ігнорування перенаправлень, але отримання заголовків та вмісту

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

// Інформація заголовка, а також мета-дані
// про потік
var_dump(stream_get_meta_data($stream));

// Наявні дані в $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>

Примітки

Зауваження: Опції контекста потоку основного сокета
Додаткові опції контекста можуть підтримуватись через основні транспортні протоколи Для потоків http://, посилаються на опції контекста транспортних протоколів tcp://. Для потоків https://, посилаються на опції контекста транспортних протоколів ssl://.

Зауваження: Рядок стану HTTP
Коли цей потік обгортки слідує перенаправленням, дані обгортки (wrapper_data), що повертаються через stream_get_meta_data() можуть не обов'язково містити рядок стану HTTP, який насправді застосовується до даних контента через індекс 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',
    ...
Перший запит повертає 301 (постійну переадресацію), так що потік обгортки автоматично слідує переадресації щоб отримати відповідь 200 (index = 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