$data = file_get_contents("php://input");
php://input は、要求された生データにアクセスできる読み取り専用ストリームです。
POST リクエストの場合、特定の php.ini ディレクティブに依存しないため、$HTTP_RAW_POST_DATA の代わりに php://input を使用することをお勧めします。
また、この場合、$HTTP_RAW_POST_DATA はデフォルトでは設定されず、always_populate_raw_post_data をアクティブにするよりも必要なメモリが少なくなる可能性があります。
enctype="multipart/form-data"を使用した場合、php://inputは無効となります。
1、php://input は、POST メソッドまたは GET メソッドで送信されたデータであっても、Content-Length で指定された長さの http エンティティボディの指定された長さの値を読み取ることができます。ただし、通常、GET メソッドがデータを送信するとき、http リクエスト エンティティの本体部分は空です。
2. php://input と $HTTP_RAW_POST_DATA で読み取られるデータは、Content-Type が multipart/form-data ではないデータのみを読み取ります。
勉強メモ
1. Coentent-Type 値が application/x-www-data-urlencoded および multipart/form-data の場合にのみ、PHP は http リクエスト パケット内の対応するデータをグローバル変数 $_POST に書き込みます
2. Content-Type タイプが PHP によって認識されない場合、http リクエスト パッケージ内の対応するデータは変数 $HTTP_RAW_POST_DATA に埋められます
3. Coentent-Type が multipart/form-data の場合のみ、PHP は埋め込みませんhttp リクエスト パケット内の対応するデータを php://input に追加します。それ以外の場合は、他の場合でも同じになります。 Coentent-Length で指定されるパディングの長さ。
4. Content-Type が application/x-www-data-urlencoded の場合のみ、php://input データは $_POST データと一致します。
5. php://input データは常に $HTTP_RAW_POST_DATA と同じですが、php://input は $HTTP_RAW_POST_DATA よりも効率的で、php.ini で特別な設定を必要としません
6. PHP は、 PATH フィールドにグローバル変数 $_GET を入力します。通常、GET メソッドによって送信される http リクエストの本文は空です。
例
1.php は、file_get_contents("php://input") または $HTTP_RAW_POST_DATA を使用して XML データを受信できます
例:
getXML.php;//XML アドレスを受信します
$xmldata = file_get_contents( "php://input");
$data = (array)simplexml_load_string($xmldata);
?> .php
$xml = '
$url = 'http://localhost/test/getXML.php';// XML アドレスを受信
$header = 'Content-type: text/xml';// コンテンツの定義- type as xml
$ch =curl_init(); //curl を初期化
curl_setopt($ch, CURLOPT_URL, $url); //リンクを設定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//情報を返すかどうかを設定
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//HTTPヘッダーを設定します
curl_setopt($ch, CURLOPT_POST, 1);/ /POSTモードに設定します
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//POST data
$response =curl_exec($ch);// 戻り情報を受け取る
if(curl_errno($ch)){// エラーが発生した場合 エラー情報を表示
Print Curl_error ($ CH)
}
CURL_CLOSE ($ CH); ); // CURL リンクを閉じる
echo $response; // リターン情報を表示
btn.png');
$http_entity_body = $data;
$http_entity_length = '127.0.0.1'; $port = 80;
$path = '/image.php';
$fp = fsockopen($host , $error_no, $error_desc, 30);
if ($fp){
fputs($fp, "POST {$path} HTTP/1.1rn");
fputs($fp, "ホスト: {$ host}rn");
fputs($fp, "Content-Type: {$http_entity_type}rn"); fputs($fp, "コンテンツの長さ: {$http_entity_length}rn"); fputs($fp, "接続: より近いnrn");
fputs($fp, $http_entity_body . "rnrn");
while (!feof($fp)) {
$d .= fgets($fp, 4096);
}
fclose($fp);
echo $d;
}
?>
受信文件
/**
*画像データを受け取る
**/
error_reporting(E_ALL);
function get_contents() {
$xmlstr= file_get_contents("php://input");
$filename=time().'.png';
if(file_put_contents($filename,$xmlstr)){
echo '成功';
}else{
echo '失敗しました';
}
}
get_contents();
?>
3.获取HTTP请求翻訳文
/**
* HTTP リクエストの元のテキストを取得します
* @return string
*/
function get_http_raw() {
$raw = '';
// (1) 请求行
$raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."rn";
// (2) 请求Headers
foreach($_SERVER as $key => $value) {
if(substr($key, 0, 5) === 'HTTP_') {
$key = substr( $key, 5);
$key = str_replace('_', '-', $key);
$raw .= $key.': '.$value."rn";
}
}
// (3) 空行
$raw .= "rn";
// (4) 请求本文
$raw .= file_get_contents('php://input');
$raw を返します。
}