フォーム POST と fsockopen の送信メソッドの違いを比較してください。
フォームが POST モードで送信されると、
$_POST と php://input は値を取得できますが、$HTTP_RAW_POST_DATA は空です。
$_POST は、送信されたデータを連想配列に編成し、urldecode などのエンコード処理、さらにはエンコード変換を実行します。
php://input は、入力ストリームを通じてファイルを読み取ることで、未処理
の POST 生データを取得できます。 $HTTP_RAW_POST_DATA よりもメモリへの負担が少なく、特別な php.ini 設定は必要ありません。 php://input は enctype="multipart/form-data" では使用できません。
POST データを送信する fsockopen の例:
$sock = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)n");
$data = "txt=" . urlencode("中") . "&bar=" . バーの値" ;
fwrite($sock, "POST /posttest/response.php HTTP/1.0rn");
fwrite($sock, "ホスト: localhostrn");
fwrite($sock, "コンテンツ タイプ: application/x-www-form-urlencodedrn");
fwrite($sock, "コンテンツの長さ: " . strlen($data) . "rn");
fwrite($sock, "受け入れる: */*rn");
fwrite($sock, "rn");
fwrite($sock, "$datarn");
fwrite($sock, "rn");
$headers = "";
while ($str = トリム(fgets($sock, 4096)))
$headers .= "$strn";
エコー「n」;
$body = "";
その間 (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
echo $body;
(1) の結果と一致します
。
1. 元の POST データを簡単に取得するには、php://input を使用します。
2. $HTTP_RAW_POST_DATA は、POST の Content-Type タイプが PHP によって認識されない場合にのみ有効です。
たとえば、通常はページ フォームを通じて送信される POST データを渡すことができません。 $ HTTP_RAW_POST_DATA を通じて抽出されます。そのエンコーディング タイプ属性 (enctype 属性) は application/x-www-form-urlencoded、multipart/form-data です。
注: ページ内の enctype 属性を PHP で認識されない型に明示的に変更した場合でも、無効のままです。
フォーム送信エンコーディング属性はフォームに制限されているため、認識できないタイプはデフォルトのエンコーディング (つまり application/x-www-form-urlencoded) で送信されたものとみなされます。
3. データが application/x-www にある場合のみ $_POST -form-urlencoded タイプは送信時にのみ取得できます。