CakeFest 2024: The Official CakePHP Conference

HTTP-Kontextoptionen

HTTP-KontextoptionenListe der HTTP-Kontextoptionen

Beschreibung

Kontextoptionen für die Transportprotokolle http:// und https://.

Optionen

method string

GET, POST oder eine andere vom entfernten Server unterstützte HTTP-Methode.

Der Standardwert ist GET.

header array oder string

Zusätzliche Kopfzeilen, die während der Anfrage gesendet werden. Die Werte in dieser Option überschreiben andere Werte (wie User-Agent:, Host:, und Authentication:), selbst wenn sie Location:-Weiterleitungen folgen. Es ist daher nicht empfehlenswert, eine Host:-Kopfzeile zu setzen, wenn follow_location aktiviert ist.

user_agent string

Der Wert, der mit der Kopfzeile User-Agent: gesendet wird. Dieser Wert wird nur verwendet, wenn der User-Agent nicht in der obigen Kontextoption header angegeben wurde.

Standardmäßig wird der Wert von user_agent aus der php.ini verwendet.

content string

Zusätzliche Daten, die nach den Kopfzeilen gesendet werden; wird in der Regel bei POST- oder PUT-Anfragen verwendet.

proxy string

Der URI, der die Adresse des Proxy-Servers angibt (z. B. tcp://proxy.example.com:5100).

request_fulluri bool

Wenn auf true gesetzt, wird beim Aufbau der Anfrage der gesamte URI verwendet (z. B. GET http://www.example.com/path/to/file.html HTTP/1.0). Dies ist zwar kein Standard-Anfrageformat, wird aber von einigen Proxy-Servern verlangt.

Der Standardwert ist false.

follow_location int

Folgt den Weiterleitungen der Kopfzeile Location; zum Deaktivieren auf 0 setzen.

Der Standardwert ist 1.

max_redirects int

Die maximale Anzahl der zu verfolgenden Weiterleitungen. Der Wert 1 oder weniger bedeutet, dass keine Weiterleitungen verfolgt werden.

Der Standardwert ist 20.

protocol_version float

Die Version des HTTP-Protokolls.

Seit PHP 8.0.0 ist der Standardwert 1.1; vorher war es 1.0.

timeout float

Das Zeitlimit für Lesevorgänge in Sekunden, angegeben durch einen Wert vom Typ float (z. B. 10.5).

Standardmäßig wird der Wert von default_socket_timeout aus der php.ini verwendet.

ignore_errors bool

Ruft den Inhalt auch dann ab, wenn ein Fehlerstatus vorliegt.

Der Standardwert ist false.

Beispiele

Beispiel #1 Abrufen einer Seite mit Übermittlung von POST-Daten

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

?>

Beispiel #2 Weiterleitungen ignorieren, aber Kopfzeilen und Inhalt abrufen

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

// die Header-Informationen sowie die Metadaten über den Stream
var_dump(stream_get_meta_data($stream));

// die eigentlichen Daten von $url
var_dump(stream_get_contents($stream));
fclose($stream);
?>

Anmerkungen

Hinweis: Kontextoptionen für den zugrundeliegenden Socket-Stream
Vom zugrundeliegenden Transport können zusätzliche Kontextoptionen unterstützt werden. Für http://-Streams, siehe Kontextoptionen für das Transportprotokoll tcp://. Für https:// Streams, siehe Kontextoptionen für das Transportprotokoll ssl://.

Hinweis: HTTP-Statuszeile
Wenn dieser Stream-Wrapper einer Weiterleitung (Redirect) folgt, ist der Inhalt von Index 0 in den von stream_get_meta_data() zurückgegebenen wrapper_data nicht unbedingt die HTTP-Statuszeile für diesen Inhalt.

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',
    ...
Die erste Anfrage lieferte eine 301 (permanente Weiterleitung), sodass der Stream-Wrapper automatisch der Weiterleitung folgte, bei der er eine 200-Antwort erhielt (index = 4).

add a note

User Contributed Notes 10 notes

up
31
nate
9 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
15
daniel dot peder at gmail dot com
6 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
6 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
13
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
3
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
3
ywarnier at beeznest dot org
6 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
4
aruntechguy at outlook dot com
6 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
8
vchampion at gmail dot com
11 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
5
jay
8 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
2
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