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

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

説明

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

オプション

method string

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

デフォルトは GET です。

header 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
4
vchampion at gmail dot com
1 year 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
0
nate
6 days 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
0
gourav sarkar
3 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
-1
chris
2 months 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 );
?>
up
-5
TxRx
4 years ago
Note that if the server is not able to 'getaddresses' change the name to an ip address and that'll sort that out for internal looking calls and posts.
To Top