PHP 8.4.1 Released!

Опции HTTP-контекста

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

Описание

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

Опции

method string

Методы GET, POST или любой другой HTTP-метод, который поддерживает удалённый сервер.

По умолчанию — GET.

header array или string

Дополнительные заголовки для отправки во время запросом. Значения в этой опции переопределяют другие значения (например, User-agent:, Host: и Authentication:), даже при следовании перенаправлениям заголовка Location:. Поэтому не рекомендуется устанавливать заголовок Host:, если включили опцию follow_location.

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 bool

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

По умолчанию false.

follow_location int

Опция указывает, следовать ли перенаправлениям заголовка Location. Чтобы отключить, устанавливают значение 0.

По умолчанию — 1.

max_redirects int

Максимальное количество перенаправлений, которым можно следовать. Значение 1 или меньше означает, что перенаправления не выполняются.

По умолчанию 20.

protocol_version float

Версия HTTP-протокола.

С PHP 8.0.0 значение по умолчанию — 1.1; до этой версии значение по умолчанию равнялось 1.0.

timeout float

Время ожидания на чтение в секундах в виде числа с плавающей точкой (float), например 10.5.

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

ignore_errors bool

Опция указывает, извлекать ли содержимое даже при неуспешных статусах завершения.

По умолчанию — false.

Примеры

Пример #1 Пример получения страницы и отправки данных методом POST

<?php

$postdata
= http_build_query(
array(
'var1' => 'некоторое содержимое',
'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 Permanently',
    1 => 'Cache-Control: no-cache',
    2 => 'Connection: close',
    3 => 'Location: http://example.com/foo.jpg',
    4 => 'HTTP/1.1 200 OK',
    ...
Первый запрос вернул код 301 (постоянное перенаправление), поэтому обёртка потока автоматически последовала перенаправлению, чтобы получить ответ с кодом 200 (индекс = 4).

Добавить

Примечания пользователей 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