Re:PHPの標準関数でPOSTする方法

PHPでPOSTを送信するとなると、Pearのライブラリを使った方法が一般的だと思いますが、Pearなんて大嫌いだという人もいるかと思います。そこで、PHPの標準関数だけでPostを実行する関数を作ってみました。間違ってるよとか、つかいづれーとか、もっと言い書き方があるよ、なんて意見があればはてぶでがんがん叩いていただけると幸いです。

PHPの標準関数でPOSTする方法 | eラーニングをすべての人に!blog.eラーニング.co.jp

元コードはリンク先で見てもらうとして、僕がつかいづれーとか思ったのは以下。

  • httpsに対応していない
  • ポートが80固定

というわけで書いてみました。

<?php
error_reporting(E_ALL);

function post($url, $data, $headers = array()) {
    $content = http_build_query($data);
    $headers += array(
        'Content-type'   => 'application/x-www-form-urlencoded',
        'Content-Length' => strlen($content),
    );
    $header = '';
    foreach ($headers as $key => $val) {
        $header .= "$key: $val\r\n";
    }
    $params = array(
        'http' => array(
            'method'  => 'POST',
            'header'  => $header,
            'content' => $content,
        ),
    );
    $context = stream_context_create($params);
    if (!$fp = fopen($url, 'rb', false, $context)) {
        return false;
    }
    return stream_get_contents($fp);
}
echo post('http://example.com/',               array('hoge' => 1)); // ふつう
echo post('https://example.com/',              array('huga' => 2)); // https
echo post('http://example.com:8000/',          array('piyo' => 3)); // ポート指定
echo post('http://user:password@example.com/', array('piyo' => 4)); // こんなのも!・・・でも使うか?

例外処理などを全然考えてない感じのコードですので、割とどうでも良い用途にしか使えそうにありませんが、
さくっとやりたいだけならこんな感じでも良いのでしょうかね。

蛇足

元コードの方に、バックスラッシュと意味の無いグルーピング*1のせいで見難い正規表現がありますが、これは以下のように変更すると良いと思います。

<?php
$pattern = "/^(http):\/\/([^\/]+)\/.*$/i"; // なにがなんだか><

$pattern = '!^http://([^/]+)/.*$!i'; // やったね!

*1: (http)で後方参照可能なグルーピングをしているが、参照してる所が無い