HTTP コンテキストオプション

HTTP コンテキストオプションHTTP コンテキストオプションの一覧

説明

http:// および https:// トランスポート用のコンテキストオプションです。

オプション

method string

リモートサーバーでサポートされる GETPOST あるいはその他の HTTP メソッド。

デフォルトは GET です。

header array あるいは string

リクエストに付加されるヘッダ。ここで指定した値が (User-agent:Host:、 および Authentication: などの) 他の値を上書きすることもあります。

user_agent string

User-Agent: ヘッダとして送信する値。上で説明した header オプションで user-agent が 定義されていない場合のみ使用されます。

デフォルトでは、php.iniuser_agent の設定内容を使用します。

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 です。

注意:

5.3.0 より前のバージョンの PHP では chunked transfer decoding を実装していません。 この値を 1.1 に設定するなら、 1.1 準拠にするのは自分の責任となります。

timeout float

読み込みタイムアウト秒数を float (例 10.5) で指定します。

デフォルトでは php.ini 設定 default_socket_timeout の値を使用します。

ignore_errors boolean

ステータスコードが失敗を意味する場合でもコンテンツを取得します。

デフォルトは FALSE です。

変更履歴

バージョン 説明
5.3.4 follow_location が追加されました。
5.3.0 protocol_version1.1 を設定した場合に、 chuned transfer decoding をサポートするようになりました。
5.2.10 ignore_errors が追加されました。
5.2.10 header に数値添字の配列を使用できるようになりました。
5.2.1 timeout が追加されました。
5.1.0 HTTP プロキシを使用した HTTPS のプロキシが追加されました。
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 ステータスライン
このストリームラッパーがリダイレクトをたどると、 stream_get_meta_data() が返す wrapper_data のインデックス 0 の内容が必ずしもそのコンテンツの HTTP ステータスラインであるとは限らなくなります。

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 (permanent redirect) を返したので、ストリームラッパーが自動的にリダイレクト先をたどり、レスポンス 200 (インデックス = 4) を取得しました。

add a note add a note

User Contributed Notes 5 notes

up
10
nate
3 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
6
vchampion at gmail dot com
4 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
4
gourav sarkar
6 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
2
jay
2 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
3 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