CakeFest 2024: The Official CakePHP Conference

HTTP bağlamı seçenekleri

HTTP bağlamı seçenekleriHTTP bağlamı seçeneklerinin listesi

Açıklama

http:// ve https:// aktarımları için bağlam seçenekleri.

Seçenekler

method string

Uzak sunucu tarafından desteklenen GET, POST veya başka bir HTTP yöntemi.

GET öntanımlıdır.

header array veya string

İstek sırasında gönderilecek ek başlıklar. Bu seçenekte belirtilen değerler, ardından gelen Location: yönlendirmelerinde bile, diğer değerleri geçersiz kılar (User-agent:, Host:, Authentication: gibi). Bu bakımdan, follow_location etkinken Host: başlığının atanması önerilmez.

user_agent string

User-Agent: başlığı ile gönderilecek değer. Bu değer sadece, tarayıcı header seçeneği ile belirtilmemişse kullanılır.

Öntanımlı olarak, php.ini dosyasındaki user_agent değeri kullanılır.

content string

Başlıklardan sonra gönderilecek ek veri. Normalde POST veya PUT istekleriyle kullanılır.

proxy string

Vekil sunucunun adresini belirten URI (tcp://vekil.example.com:5100 gibi).

request_fulluri bool

true atanırsa, istek oluşturulurken URI'nin tamamı kullanılır (GET http://example.com/dizin/yolu/dosya.html HTTP/1.0 gibi). Bu standart dışı bir istek biçimi olsa da bazı vekil sunucular bunun böyle olmasını gerektirirler.

false öntanımlıdır.

follow_location int

Location başlık yönlendirmelerini izler. İptal etmek için 0 atayın.

1 öntanımlıdır.

max_redirects int

İzlenecek yönlendirmelerin azami sayısı. 1 veya daha az bir değer belirtilmesi hiçbir yönlendirmenin izlenmeyeceği anlamına gelir.

20 öntanımlıdır.

protocol_version float

HTTP protokolünün sürümü.

PHP 8.0.0 itibariyle 1.1 öntanımlıdır, evvelce 1.0 sürümü öntanımlıydı.

timeout float

Bir float değer olarak saniye cinsinden okuma zaman aşımı. (10.5 gibi).

Öntanımlı olarak, php.ini dosyasındaki default_socket_timeout yönergesinin değeri kullanılır.

ignore_errors bool

Başarısızlık durumu kodlarında bile içerik alınır.

false öntanımlıdır.

Örnekler

Örnek 1 - Bir sayfayı çekip veriyi POST ile göndermek

<?php

$postverisi
= http_build_query(
array(
'var1' => 'biraz içerik',
'var2' => 'eh işte'
)
);

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

$bağlam = stream_context_create($seçenekler);

$sonuç = file_get_contents('http://example.com/submit.php', false, $bağlam);

?>

Örnek 2 - Başlıklar ve içerik alınırken yönlendirmeleri yoksaymak

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

// meta veri ve başlıklar
var_dump(stream_get_meta_data($stream));

// esas veri
var_dump(stream_get_contents($stream));
fclose($stream);
?>

Notlar

Bilginize: Temel soket akımı bağlamı seçenekleri
Ek bağlamsal seçenekler temel aktarım tarafından desteklenebilir. http:// akımları için tcp:// aktarımının bağlamsal seçeneklerine atıf yapılır. https:// akımları için ise ssl:// aktarımının bağlamsal seçeneklerine atıf yapılır.

Bilginize: HTTP durum satırı
Bu akım sarmalayıcı bir yönlendirmeyi izlerken stream_get_meta_data() tarafından döndürülen wrapper_data, gerçekte 0 indisinde içerik verisine uygulanan HTTP durum satırını içermeyebilir.

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',
    ...
İlk istek 301 (kalıcı yönlendirme) ile döndü, dolayısıyla akım sarmalayıcı otomatik olarak yönlendirmeyi izleyip bir 200 yanıtı aldı (indis = 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