PHPでPOSTの本文を取得するにはどうすればいいですか? 質問する

PHPでPOSTの本文を取得するにはどうすればいいですか? 質問する

次の内容を 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:NNNN一時ファイルを使用する前にメモリに保持するデータの最大量 (バイト単位) です。

もちろん、入力ストリームをシークする本当に正当な理由がない限り、Web アプリケーションでこの機能は必要ありません。HTTP 要求エンティティ本体を 1 回読み取るだけで通常は十分です。アプリが何をすべきかを判断する間、クライアントを 1 日中待たせないでください。

Content-Type: multipart/form-dataphp://input は、ヘッダー ( HTML フォーム内)を指定するリクエストでは利用できないことに注意してくださいenctype="multipart/form-data"。これは、PHP がすでにフォーム データをスーパー$_POSTグローバルに解析しているためです。

おすすめ記事