(PHP)fsockopenを使い、データをPOST後そのままPOST先のURLに遷移したい


最も参考になる回答をいただけた方に100P差し上げます
よろしくお願い致します

なお下記のようなスクリプトを書いてみましたが
これではPOSTはするものの、画面が遷移できませんでした
(URLはダミーです)

--- sample script ---
$sock = fsockopen("hoge.com", 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)¥n");

$data = "regist=" . urlencode("true") . "&bar=" . urlencode("ceil");

fputs($sock, "POST /index.php HTTP/1.0¥r¥n");
fputs($sock, "Host: hoge.com¥r¥n");
fputs($sock, "Content-type: application/x-www-form-urlencoded¥r¥n");
fputs($sock, "Content-length: " . strlen($data) . "¥r¥n");
fputs($sock, "Accept: */*¥r¥n");
fputs($sock, "¥r¥n");
fputs($sock, "$data¥r¥n");
fputs($sock, "¥r¥n");

$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str¥n";

print "¥n";

$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);

fclose($sock);

回答の条件
  • 1人2回まで
  • 登録:2008/09/24 11:39:06
  • 終了:2008/09/24 13:46:51

回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/09/24 13:38:42

ポイント100pt

fsockopenやfopenなどは

データのやりとりを開始するためのもので遷移は出来ないです。


headerを使えば

遷移は出来ますがPOSTでデータを渡す事は出来ません。

(GETならURLの後にパラメータをつけ加えるだけだから使えます)


cURLが導入されていればお望みの事が可能ですが php 標準ではないので

お使いのサーバに導入されているかどうかは・・・?

PHP: cURL - Manual

まずはphp_infoでサーバの情報を取得して

Configure Command の中に '--with-curl' という一文を探してみてください。

'--with-curl'があれば導入されてます。

導入されていなければphpから直接遷移する方法は無いかもしれません。


cURLなどが無くphpから直接が無理な場合は

遷移するようなクライアントサイドスクリプトを組み込んだページを生成して

クライアントのブラウザ上から呼び出すというような形にするか

どうしてもサーバーサイドで飛ばしたい場合はperlなど別の手段がないかを

探ると言う事になるかと思いますが、それはまた別の話・・・。

id:jayz

fsockopenではPOSTでデータを送り、画面を遷移することができないんですね・・・

今回の場合GETではなく、どうしてもPOSTでデータを送信したい事情があるため

cURLを導入して試してみようと思います

非常に参考になりました。ありがとうございます

2008/09/24 13:46:33
  • id:pahoo
    早々に回答締切になってしまいましたが、fsockopenでも画面遷移できます。
    もちろん cURL でもPOST渡し&画面遷移は可能です。


    質問のソース中の

    $headers = "";
    while ($str = trim(fgets($sock, 4096)))
    $headers .= "$str\n";

    print "\n";

    の部分が余計です。これを除けば、正常に遷移するはずです。
    httpヘッダの削除については、もう少し工夫してください。


    あと、質問文のソースを見て気になったのですが、バックスラッシュ(円マーク)の文字コードが 00A5(Unicode) でした。正しくは 005C(Unicode) です。
    どちらも見た目はほとんど同じなのですが、00A5 の方は「半角円マーク」として処理されますので、プログラムが正常に動作しません。


    [参考サイト]
    http://www.pahoo.org/e-soul/webtech/php02/php02-18-01.shtm
  • id:jayz
    pahooさんありがとうございます
    cURLを導入するにはPHPをコンパイルしなおさなければならない手間があるためpahooさんの案から試してみました

    指定のソースを削り、¥マークをすべて一度消して再度打ち直した後に再度実行しましたが
    画面は遷移しませんでした

    $bodyをechoすると遷移先のソースが入ってはいたんですが・・・
  • id:jayz
    ハッ・・・
    重要なことを言い忘れていました
    POST先は同じサーバではなく別のサーバになります
  • id:kn1967
    遷移ではなく取り込む形でよければ
    $bodyをechoで吐き出すだけですが
    ご質問の主旨は1行目の「URLの遷移」ですよね?


  • id:pahoo
    header("Location: hogehoge") を使ってはどうですか?
    以下が参考になると思います。
    http://blog.karakuriya.biz/web/000722.html

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません