ホームページ >バックエンド開発 >PHPチュートリアル >PHP 入力ストリーム php://input 命令 (1/2)_PHP チュートリアル

PHP 入力ストリーム php://input 命令 (1/2)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:11:18916ブラウズ

xml-rpc を使用する場合、サーバー側は、$_POST 配列ではなく、主に php 入力ストリーム入力を通じてクライアント データを取得します。したがって、ここでは主に php 入力ストリーム php://input

php://input の概要について説明します。 PHP の公式マニュアル文書には、それについて明確に説明した段落があります。

「php://input を使用すると、生の POST データを読み取ることができます。$HTTP_RAW_POST_DATA に代わるメモリ消費量が少なく、特別な php.ini ディレクティブは必要ありません。php://input は enctype=”multipart/ では使用できません。」フォームデータ」。

翻訳するとこんな感じです

"php://input は、未処理の POST データを読み取ることができます。$HTTP_RAW_POST_DATA と比較して、メモリへの負担が少なく、特別な php.ini 設定は必要ありません。php://input enctype=multipart/form-data には使用できません”


この概要をどう理解すればいいのか!? 3つの部分に分けて段階的に理解していきました。

POSTデータを読む
マルチパート/フォームデータ型には使用できません
php://input VS $HTTP_RAW_POST_DATA
POSTデータを読む
PHPer は組み込み変数 $_POST に精通している必要があります。 $_POST と php://input の関係と違いは何ですか? また、クライアントがサーバーと対話するために最も一般的に使用されるメソッドは、POST に加えて GET です。 php://input は PHP の入力ストリームとして機能するので、GET データを読み込むことができますか?これら 2 つの質問が、このセクションで説明する必要がある主な内容です。
経験上、テストと観察から要約することは非常に効果的な方法であることがわかっています。ここでは、テストに役立つスクリプトをいくつか書きました。

@file 192.168.0.6:/phpinput_server.php 受信したデータを出力します
@file 192.168.0.8:/phpinput_post.php は、POST メソッドによるフォームデータの送信をシミュレートします
@file 192.168.0.8:/phpinput_xmlrpc.php は、POST メソッドを使用した xmlrpc リクエストの作成をシミュレートします。
@file 192.168.0.8:/phpinput_get.php は、GET メソッドによるフォーム番号の送信をシミュレートします
phpinput_server.php と phpinput_post.php

コードは次のとおりです コードをコピー
//@ファイル phpinput_server.php
$raw_post_data = file_get_contents('php://input', 'r');
エコー "------$_POST-------";
echo var_dump($_POST) . "n";
echo "----------php://input---------------n";
echo $raw_post_data . "n";
?>

//@ファイル phpinput_post.php
$http_entity_body = 'n=' .urldecode('perfgeeks') .urldecode('7788');
$http_entity_type = 'application/x-www-form-urlencoded';
$http_entity_length = strlen($http_entity_body);
$host = '192.168.0.6';
$ポート = 80;
$path = '/phpinput_server.php';
$fp = fsockopen($host, $port, $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);
エコー $d;
}
?>


ngrep ツールを使用して http リクエスト パケットをキャプチャできます (検出する必要があるのは php://input であるため、ここでは http リクエスト パケットのみをキャプチャします)。テストスクリプトphpinput_post.phpを実行してみましょう

ngrep を通じてキャプチャされた http リクエスト パケットは次のとおりです:

T 192.168.0.8:57846 -> 192.168.0.6:80 [AP]
POST /phpinput_server.php HTTP/1.1..
ホスト: 192.168.0.6..Content-Type: application/x-www-form-urlencoded..Co
ntent-Length: 18..Connection: close....n=perfgeeks&p=7788....
注意深く観察すると、見つけるのは難しくありません
1. $_POST データ、php://input データ、httpd エンティティ本体データは「一貫性」があります
2. http リクエストの Content-Type は application/x-www-form-urlencoded です。これは、http リクエスト本文のデータが、http post メソッドを使用して送信されたフォーム データであり、urlencode() によって処理されたことを意味します。
(注: 太字の部分に注意してください。以下では説明しません)。

1 2

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629599.html技術記事 xml-rpc を使用する場合、サーバー側は、$_POST 配列ではなく、主に PHP 入力ストリーム入力を通じてクライアント データを取得します。したがって、ここでは主に php 入力ストリーム php://input と php://i... について説明します
コードは次のとおりです コードをコピー
@php /phpinput_post.php
HTTP/1.1 200 OK
日付: 2010 年 4 月 8 日木曜日 03:23:36 GMT
サーバー: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
コンテンツの長さ: 160
接続: 閉じる
コンテンツタイプ: text/html; -------$_POST---------------------
配列(2) {
["n"]=> 文字列(9) "perfgeeks"
["p"]=> 文字列(4) "7788"
}
-------php://input---------------
n=perfgeeks&p=7788

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。