まず検索してみました。
「cURLを使わずに、PHPでPOSTリクエストを送信する」
を発見。
早速コピペして実行。
しかしエラー検出・・・
ソースを見返すと、stream_get_contents(PHP5)が使われています。
なので、もう一度検索。
「PHPのちょっとしたTIPS」
を発見。
これで出来そうです(作者に感謝!)。
http://のほか、https://も動作するようです。
しかし不具合が起こるケースをひとつ見つけました。
Basic認証の際、パスワードにスラッシュが含まれると、不具合が発生するようです。
そこでちょっとだけ改良してみました。(結果OKです。)
function http($url,$method="GET",$headers="",$post=array(""),$id=array("")) {
/* URLを分解 */
$URL = parse_url($url);
/* クエリー */
if (isset($URL['query'])) {
$URL['query'] = "?".$URL['query'];
} else {
$URL['query'] = "";
}
/* デフォルトのポートは80 */
if (!isset($URL['port'])) $URL['port'] = 80;
/* リクエストライン */
$request = $method." ".$URL['path'].$URL['query']." HTTP/1.0¥r¥n";
/* リクエストヘッダ */
$request .= "Host: ".$URL['host']."¥r¥n";
$request .= "User-Agent: PHP/".phpversion()."¥r¥n";
/* Basic認証用のヘッダ */
if (isset($URL['user']) && isset($URL['pass'])) {
$request .= "Authorization: Basic ".base64_encode($URL['user'].":".$URL['pass'])."¥r¥n";
} else if (isset($id['user']) && isset($id['pass'])) {
$request .= "Authorization: Basic ".base64_encode($id['user'].":".$id['pass'])."¥r¥n";
}
/* 追加ヘッダ */
$request .= $headers;
/* POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付 */
if (strtoupper($method) == "POST") {
while (list($name, $value) = each($post)) {
$POST[] = $name."=".urlencode($value);
}
$postdata = implode("&", $POST);
$request .= "Content-Type: application/x-www-form-urlencoded¥r¥n";
$request .= "Content-Length: ".strlen($postdata)."¥r¥n";
$request .= "¥r¥n";
$request .= $postdata;
} else {
$request .= "¥r¥n";
}
/* WEBサーバへ接続 */
$fp = fsockopen($URL['host'], $URL['port']);
/* 接続に失敗した時の処理 */
if (!$fp) {
die("ERROR¥n");
}
/* 要求データ送信 */
fputs($fp, $request);
/* 応答データ受信 */
$response = "";
while (!feof($fp)) {
$response .= fgets($fp, 4096);
}
/* 接続を終了 */
fclose($fp);
/* ヘッダ部分とボディ部分を分離 */
$DATA = split("¥r¥n¥r¥n", $response, 2);
/* リクエストヘッダをコメントアウトして出力 */
echo "¥n";
/* レスポンスヘッダをコメントアウトして出力 */
echo "¥n";
/* メッセージボディを出力 */
echo $DATA[1];
}










fsockopenに
ssl://
をつける手法もあります。
サーバーにOpenSSLとかが入ってないと使えませんが…