Web系のこととかー。

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;

これが正しい…はず。

…と、勢いで作ってみたけど、間違っている箇所あるかも。校正プリーズ。

§320 · 3月 8, 2011 · プログラミング_PHP · · [Print]

4 Comments to “ウェブル@soraiyさんのPHP で凄く簡単に GET/POST 送信ができる関数を勝手に改良した”

  1. 石崎顔面ブロック より:

    はじめまして。石崎顔面ブロックと申します。

    プログラミングの初心者ですが、大変興味を持ち、ここに掲載されているものを使わせて頂きました。

    そこで質問なのですが、これは異なるドメインに対してPOSTで送信することはできるのでしょうか?

    今私は、サイト管理の都合上、このソースで造ったPHPファイルを置く場所(ドメイン)と、もうひとつ別のドメインを持っています。

    データベースを使う程のものでもないので、双方でじかに相互にPOST送信し合えるのが理想的です。

    実際に試してみたのですが、以下のようなレスポンスが画面上部に記載されました。
    string(6) “200 OK” string(6) “200 OK” bool(false) bool(false)

    これ以降は、通常のPOST送信を実行した際に表示されるレスポンスと全く同一でした。

    これは成功したと言えるのでしょうか?

  2. zaru より:

    異なるドメインであっても、GET/POSTは通常通りできます。

Leave a Reply