HTTP と HTTPS

PHP 3, PHP 4, PHP 5。https:// は PHP 4.3.0以降。

HTTP 1.0 により HTTP GET メソッドを用いてファイル/リソースに読み込みのみの アクセスが可能です。仮想ホストにホスト名でアクセスするために、 Host: ヘッダが送信されます。 ini ファイルまたはストリームコンテキストによって user_agent 文字列を設定している場合、 それはリクエストの中にも含まれます。

警告

IIS のような、いくつかの標準に 対応してない Web サーバは、PHP に警告を発生させるような手順でデータを送信します。 このようなサーバを使用する場合は、 error_reporting を警告を発生しないレベルまで小さくする必要があります。 PHP 4.3.7 以降では、https:// ラッパーでストリームをオープンする際に バグがある IIS サーバソフトウエアを検出することができ、この警告を抑制することができます。 あなたが ssl:// ソケットを作性するために fsockopen() を使用している場合、 自らこの警告を検出し、抑制する必要があります。

PHP 4.0.5 以降、リダイレクトがサポートされています。これ以前のバージョンを 使用している場合、URL の末尾にスラッシュを付ける必要があります。 (全てのリダイレクトが処理された後に)ドキュメント取得元のリソースの URL を知ることが 重要な場合、ストリームから返された一連のレスポンスヘッダを処理する必要があります。

<?php
$url
= 'http://www.example.com/redirecting_page.php';

$fp = fopen($url, 'r');

/* PHP 4.3.0 の場合、stream_get_meta_data() の代わりに
   $http_response_header を使用してください */
$meta_data = stream_get_meta_data($fp);
foreach(
$meta_data['wrapper_data'] as $response) {

  
/* リダイレクトされているか? */
  
if (substr(strtolower($response), 0, 10) == 'location: ') {
    
/* $url をリダイレクト先に書き換える */
    
$url = substr($response, 18);
  }

}

?>

例 O-2. ページの取得および 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);

?>

ストリームにより、リソースの body にアクセスすることが できます。ヘッダは、$http_response_header 変数に保存されます。 PHP 4.3.0 以降は、ヘッダは stream_get_meta_data() により取得できます。

HTTP 接続は読み込みのみ可で、HTTP リソースにデータを書き込んだり ファイルをコピーしたりすることはできません。

注意: HTTPS は、PHP 4.3.0 以降で OpenSSL のサポートを組み込んだ場合にサポートされます。

表 O-2. ラッパーの概要

属性サポートの可否
allow_url_fopen で制約されるYes
読み込み可Yes
書き込み可No
追記可能No
同時読み書き可N/A
stat() をサポートNo
unlink() をサポートNo
rename() をサポートNo
mkdir() をサポートNo
rmdir() をサポートNo

表 O-3. コンテキストのオプション

名前使用法デフォルト
method リモートサーバでサポートされる GETPOST あるいはその他の HTTP メソッド。 GET
headerリクエストに付加されるヘッダ。ここで指定した値が (User-agent:Host:、 および Authentication: などの)他の値を 上書きすることもあります。  
user_agentUser-Agent: ヘッダとして送信する値。上で説明した header オプションで user-agent が 定義されていない場合のみ使用されます。 php.ini での user_agent の設定
content ヘッダの後に送信する追加データ。通常、POST または PUT リクエストの際に使用されます。  
proxy プロキシサーバを示す URI(例: tcp://proxy.example.com:5100)。 (HTTP プロキシを使用した)HTTPS のプロキシ処理は、 PHP 5.1.0 以降でのみ動作します。  
request_fulluri TRUE を指定すると、リクエストを生成する際に完全な URI (GET http://www.example.com/path/to/file.html HTTP/1.0) が用いられます。これは標準のリクエストフォーマットではありませんが、 このようなフォーマットを要求するプロキシサーバも存在します。 FALSE
max_redirects リダイレクトをたどる最大数。値が 1 以下の場合は リダイレクトをたどらないことを意味します。 PHP 5.1.0 で追加されました。 20
protocol_version HTTP プロトコルのバージョン。PHP 5.1.0 で追加されました。 1.0
timeout 読み込みタイムアウト秒数を float (例 10.5) で指定します。PHP 5.2.1 で追加されました。 default_socket_timeout

基盤となるソケットストリームのコンテキストオプション: これ以外のコンテキストオプションが 基盤となるトランスポート でサポートされています。 http:// ストリームの場合は、tcp:// のコンテキストオプションを参照ください。 https:// ストリームの場合は、ssl:// のコンテキストオプションを参照ください。

バージョン 5 より前では、HTTP リクエストで独自のヘッダを送信することができます。 これは INI 設定項目 user_agent を処理する際の副作用によるものです。 user_agent に何らかの正常な文字列 (たとえばデフォルト設定の PHP/version など) を指定し、さらに続けて キャリッジリターン(\r) / ラインフィード(\n) を置いた後に任意のヘッダを記述します。 この方法は、PHP 4 以降のバージョンで動作します。

例 O-3. HTTP リクエストで独自のヘッダを送信する

<?php
ini_set
('user_agent', "PHP\r\nX-MyCustomHeader: Foo");

$fp = fopen('http://www.example.com/index.php', 'r');
?>

送信されるリクエストは次のようになります。

GET /index.php HTTP/1.0
Host: www.example.com
User-Agent: PHP
X-MyCustomHeader: Foo