soraiyさんが「PHP で凄く簡単に GET/POST 送信ができる関数を作りました」という記事でGET/POSTを簡単にできるものを公開していたんですが、ちょっと気になった部分があったので、勝手に改良してみました。
と思ったら、いろいろな人が既に反応していた…。でももう書いちゃったし、公開するか…。
var_dump(wbsRequest('GET', 'http://httpstat.us/200',array('key' => 'value')));
var_dump(wbsRequest2('GET', 'http://httpstat.us/200',array('key' => 'value')));
var_dump(wbsRequest('GET', 'http://httpstat.us/404'));
var_dump(wbsRequest2('GET', 'http://httpstat.us/404'));
//@soraiyさん作改良版
function wbsRequest($method, $url, $params = array())
{
$data = http_build_query($params);
$header = Array("Content-Type: application/x-www-form-urlencoded");
$options = array('http' => Array(
'method' => $method,
'header' => implode("\r\n", $header),
));
//ステータスをチェック / PHP5専用 get_headers()
$respons = get_headers($url);
if(preg_match("/(404|403|500)/",$respons['0'])){
return false;
}
if($method == 'GET') {
$url = ($data != '')?$url.'?'.$data:$url;
}elseif($method == 'POST') {
$options['http']['content'] = $data;
}
$content = file_get_contents($url, false, stream_context_create($options));
return $content;
}
//cURL版
function wbsRequest2($method, $url, $params = array())
{
$data = http_build_query($params);
if($method == 'GET') {
$url = ($data != '')?$url.'?'.$data:$url;
}
$ch = curl_init($url);
if($method == 'POST'){
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
}
//curl_setopt($ch, CURLOPT_HEADER,true); //header情報も一緒に欲しい場合
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
$res = curl_exec($ch);
//ステータスをチェック
$respons = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if(preg_match("/^(404|403|500)$/",$respons)){
return false;
}
return $res;
}
cURL便利だよ!
cURLは、細かくハンドリングできるし、なにより curl_multi_init が素晴らしいですね。並列で実行できます。
file_get_contentsよりもcURLの方が高速だよ!
1ラインで手軽に書ける file_get_contents は僕も重宝していますが、パフォーマンスにおいては、cURLの方が2倍弱ほど高速です。
ステータスコードをチェック!
リモートが 404 とか返してきたらエラーになっちゃうので、事前に get_headers とか使ってあげると良いかも。@でエラー抑止して$http_response_headerで取得してもいいと思います。
httpstat.us便利!
ステータスコードのチェックするときに、自前で用意しなくても http://httpstat.us/ ならURLの後ろにステータスコードを付け加えれば、そのコードで返してくれます。いつ使うんだ…と思っていたら、普通に便利でした。
ちなみに
POST時のパラメータ格納部分
//$options['content'] = $data; $options['http']['content'] = $data;
これが正しい…はず。
…と、勢いで作ってみたけど、間違っている箇所あるかも。校正プリーズ。
[...] [...]
はじめまして。石崎顔面ブロックと申します。
プログラミングの初心者ですが、大変興味を持ち、ここに掲載されているものを使わせて頂きました。
そこで質問なのですが、これは異なるドメインに対してPOSTで送信することはできるのでしょうか?
今私は、サイト管理の都合上、このソースで造ったPHPファイルを置く場所(ドメイン)と、もうひとつ別のドメインを持っています。
データベースを使う程のものでもないので、双方でじかに相互にPOST送信し合えるのが理想的です。
実際に試してみたのですが、以下のようなレスポンスが画面上部に記載されました。
string(6) “200 OK” string(6) “200 OK” bool(false) bool(false)
これ以降は、通常のPOST送信を実行した際に表示されるレスポンスと全く同一でした。
これは成功したと言えるのでしょうか?
異なるドメインであっても、GET/POSTは通常通りできます。
[...] [...]