次の内容を PHP ページに POST として送信します。
{a:1}
これはリクエストの本文です (POST リクエスト)。PHP
でその値を抽出するにはどうすればいいでしょうか?
var_dump($_POST);
解決策ではなく、機能していません。
ベストアンサー1
POST または PUT リクエスト (またはその他の HTTP メソッド) のエンティティ本体にアクセスするには:
$entityBody = file_get_contents('php://input');
また、STDIN
定数は への既に開かれたストリームなのでphp://input
、代わりに次のようにすることもできます。
$entityBody = stream_get_contents(STDIN);
からI/O ストリームに関する PHP マニュアルのエントリ:
php://input は読み取り専用ストリームで、リクエスト本体から生データを読み取ることができます。POST リクエストの場合は、特別な php.ini ディレクティブに依存しないため、の代わりにphp://input を使用することをお勧めします。さらに、がデフォルトで入力されない場合、always_populate_raw_post_data を有効にするよりもメモリをあまり消費しない可能性があります。php://input はenctype="multipart/form-data" では使用できません。
$HTTP_RAW_POST_DATA
$HTTP_RAW_POST_DATA
php://input
特に、 Web SAPI でどのようにアクセスするかに関係なく、ストリームはシーク可能ではないことに注意してください。つまり、一度しか読み取ることができません。大きな HTTP エンティティ本体が定期的にアップロードされる環境で作業している場合は、入力をストリーム形式で維持することをお勧めします (上記の最初の例のようにバッファリングするのではなく)。
ストリーム リソースを維持するには、次のような方法が役立ちます。
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
一定量のデータ (デフォルトでは 2 MB) が保存されると、ファイルシステム ストレージに透過的に切り替わるため、メモリ消費を管理できます。このサイズは、php.ini ファイルで操作するか、 を追加することで操作できます。 は/maxmemory:NN
、NN
一時ファイルを使用する前にメモリに保持するデータの最大量 (バイト単位) です。
もちろん、入力ストリームをシークする本当に正当な理由がない限り、Web アプリケーションでこの機能は必要ありません。HTTP 要求エンティティ本体を 1 回読み取るだけで通常は十分です。アプリが何をすべきかを判断する間、クライアントを 1 日中待たせないでください。
Content-Type: multipart/form-data
php://input は、ヘッダー ( HTML フォーム内)を指定するリクエストでは利用できないことに注意してくださいenctype="multipart/form-data"
。これは、PHP がすでにフォーム データをスーパー$_POST
グローバルに解析しているためです。