今まで、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以降
));

タグ [ PHP , Tips ]
トラックバック(1件)

このブログの記事が参考になりそうだったのでメモ。

とても簡単にPHPからPOSTリクエストを送信する方法【PHP】 - Programming Magic

file_get_contents()で、POSTデータまで送ってくれるのを初めて知りまし...

[2010/06/01 18:51:58]
トラックバックURL:
コメント(7件)

ありがたう。

参考になりますた。

HTTPSをアクセスするときも、同じですか?
エラーが出ます。

PHP5はallow_url_fopenが一般的なのでしょうか?

返事が遅くなってすいません。

>>3
Windowsサーバなど一部の環境では動かないことがあったり
http://www.ironhearts.com/diary/archives/000833.html
相手のサーバによってはデータが取得できるのにエラーを吐くこともあるようです。
http://q.hatena.ne.jp/1227158963

私の環境(Debian+PHP5)でいくつかのサイトに対して試してみましたが、httpsでも同じようにデータを取得できました。

>>4
allow_url_fopenはデフォルトでonになっていますが、セキュリティ対策としてoffを推奨している人もいます。
例えば、
echo file_get_contents($_GET['url']);
なんてコードが書かれているとセキュリティ的にまずいわけですね。

そのため、PHPが実行できるレンタルサーバなどではoffになっているものもあるようです。
しかし、offにするとPHPの一部の機能が使えなってしまうためonにしているところもあるようです。
どちらが一般的かはわかりません。

6. yamazon ( HP Mail ) at [2010/03/23 14:49:46]

PHPでPOST送信する方法を探しており、とても参考になりました。
ありがとうございました!

※このコメントは自動判定によりスパムと判断されたため、 管理人のチェック後に公開、または削除されます。
名前
メール
URL
内容
このコメントを管理人にのみ公開:
※コメント欄以外の入力は任意です。
※タグは全て無効化され、そのまま表示されます。
※URLには自動的にリンクが貼られます。
※管理人が不要・不適切だと判断したコメントは削除されることがあります。
※メールアドレス中の@は自動的に<atmark>などの文字に置換されて表示されます。