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を実行してみましょう
コードは次のとおりです | コードをコピー |
@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 |