今まで、PHPからPOSTリクエストを送信する方法は、fsockopen関数を使って書く方法しか知らなかったが、調べてみると意外といろいろな方法があった。

この中ではfsockopen関数を使う方法が、ライブラリのインストールや設定の変更も必要なく、PHP4でも使えて、多くの環境で使いやすい。 しかし、ストリーム関数+ファイルシステム関数を使う方法に比べると少々めんどくさい処理を書くことになる。 ストリーム関数+ファイルシステム関数を使う方法は、PHP5.0以上でallow_url_fopenが有効になっている必要はあるが、とても簡単に書くことができる。


例えば、PHPマニュアルの関数検索をPOSTでリクエストする場合には以下のようにする。

<?php
$url = 'http://www.php.net/search.php';
$data = array(
	'pattern' => 'htmlspe',
	'show' => 'quickref',
);
$options = array('http' => array(
	'method' => 'POST',
	'content' => http_build_query($data),
));
$contents = file_get_contents($url, false, stream_context_create($options));
?>

たったコレだけ。

$urlは送信先の指定、$dataは送るデータの指定で、$optionsは送信設定。 送信処理は最後の一文だけになっている。 送信が失敗したときはfalseが返される。 このとき、Content-Type、Content-Length、Hostの3つのヘッダは自動で送られる。

ヘッダを追加したい場合には以下のようにする。

<?php
$url = 'http://www.php.net/search.php';
$data = array(
	'pattern' => 'htmlspe',
	'show' => 'quickref',
);
$headers = array(
	'User-Agent: My User Agent 1.0',	//ユーザエージェントの指定
	'Authorization: Basic '.base64_encode('user:pass'),//ベーシック認証
);
$options = array('http' => array(
	'method' => 'POST',
	'content' => http_build_query($data),
	'header' => implode("\r\n", $headers),
));
$contents = file_get_contents($url, false, stream_context_create($options));
?>

stream_context_create関数で返されるリソースをストリームコンテキストといい、file_get_contents関数以外にもfopen関数readfile関数などの引数に渡すことができる。

コンテキストのオプションには、method、content、header以外にproxy、max_redirects、protocol_version、timeoutなどが指定できる。

$options = array('http' => array(
	'method' => 'POST',
	'content' => http_build_query($data),
	'header' => implode("\r\n", $headers),
	'proxy' => 'tcp://proxy.example.com:5100',
	'protocol_version' => 2.0,	//PHP5.1.0以降
	'max_redirects' => 2,	//PHP5.1.0以降
	'timeout' => 1.0,		//PHP 5.2.1以降
));