PHP :: POSTリクエストを送信する for PHP5

class HTTP
{
    /**
     * POSTリクエストを送信する (プロトコルは http のみに対応)
     * 
     * for PHP 5
     * 
     * @param string $uri 送信先URI (http://~)
     * @param array $data 送信するデータ array('name'=>'value', ...)
     * @param float $timeout タイムアウト秒
     * @return boolean
     * @access public
     * @static
     */
    public static function postRequest($uri, $data, $optional_headers = null)
    {
        $elem = parse_url($uri);
        if ($elem['scheme']) !== 'http') {
            return false;
        }
 
        $params = array();
        foreach ($data as $k => $v) {
            $params[] = $k . '=' . urlencode($v);
        }
        $param = implode('&', $params);
 
        $header = array();
        if ($optional_headers !== null) {
            foreach ($optional_headers as $k => $v) {
                $header[] = $k . ': ' . $v;
            }
        }
        $header[] = 'Content-Length: ' . strlen($param);
 
        $context = array(
            'http' => array(
                'method'  => 'POST',
                'header'  => implode("\r\n", $header),
                'content' => $data,
            )
        );
 
        $ret = file_get_contents($uri, false, stream_context_create($context));
 
        if ($ret === false) {
            return false;
        }
 
        return true;
    }


■使い方

require_once 'HTTP.php';
$uri = 'http://hoge.fuga/jojo.php';
$data = array('val_1' => '100', 'val_2' => '200');
$res = HTTP::postRequest($uri, $data);


■余談
このクラスを書いた後、PHP4 に移植する必要が出てきたので、ビジビリティー(public)の部分だけ削って即対応と思って動作確認したがまったく動かない。
小一時間ハマった後ようやく理由が分かったが、その理由は file_get_contents(filename, bool, context) 関数の第三引数 `context' が PHP5 からのサポートで、PHP4 では未対応なのが原因だった。
結局、file_get_contents() 関数が使えないのでイチから書き直したのが「POSTリクエストを送信する for PHP4」。