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は通常通りできます。
[...] [...]