今まで、PHPからPOSTリクエストを送信する方法は、fsockopen関数を使って書く方法しか知らなかったが、調べてみると意外といろいろな方法があった。
-
fsockopen関数を使う方法
→参考:PHP TIPS Vol.3 -
ソケット拡張モジュールを使う方法
→参考:HTTPリスエストをそのまま返すPHPサーバ | Shin x blog -
ストリーム関数+ファイルシステム関数を使う方法
→参考:cURLを使わずに、PHPでPOSTリクエストを送信する - PHPプロ!ニュース - HTTP拡張モジュールを使う方法
-
CURL関数を使う方法
→参考:php curlをつかったオリジナルクラス (myCurlRequest) - hiyuzawa.jpn.org -
Zend_Http_Clientを使う方法
→参考:【PHP TIPS】 51. スクリプト上で楽にデータをPOST送信しよう:ITpro -
PEAR::HTTP_Clientを使う方法
→参考:PEAR::HTTP_Clientでサイトの内容取得 - PHPプロ!TIPS+
この中では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以降
));
ありがたう。
参考になりますた。
どういたしますて。
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にしているところもあるようです。
どちらが一般的かはわかりません。
PHPでPOST送信する方法を探しており、とても参考になりました。
ありがとうございました!