PHPでプログラムをバリバリ書いている方なら御存知かもしれませんが、あるPHPファイルのプログラムを眺めていたら見なれない一文がありました。そのソースはこれ。
$hoge = file_get_contents( 'php://input' );
「php://input」って何じゃ?
上記プログラムについてちょっと調べました。私のように知らない方のために明記しておきますが、もし、知っている方はスルーしてください。間違っても悪口を書かないように(^^ゞ
早々に調べてみると、まずはfile_get_contents()関数です。これはすぐに見つかりました。PHPのドキュメントを見るとこちらに
ファイルの内容を全て文字列に読み込む
と、書かれています。ドキュメント内にも「file()関数と似ている」と書かれていますが、file()関数よりも取得する内容などを細かく設定できます。
さて、問題は「php://input」です。恥ずかしながら今までこのような文字列は見たことがありませんでした。早々に調べてみたところPHPのドキュメントのこちらに書かれていました。読んでみると
php://input は読み込み専用のストリームで、 リクエストの body 部から生のデータを読み込むことができます。
ふむふむ・・・φ(..)メモメモ。更に読み進めると
POST リクエストの場合は $HTTP_RAW_POST_DATA よりも php://input を使うのが望ましいでしょう。php.ini ディレクティブの設定に依存しないからです。 さらに、$HTTP_RAW_POST_DATA がデフォルトで設定されない場合は、 always_populate_raw_post_data を有効にするよりも $HTTP_RAW_POST_DATA を使うほうがメモリの消費量が少なくなるでしょう。 php://input は、 enctype=”multipart/form-data” に対しては使用できません。
ん~、さっぱりわかりません。仕方がないので他のサイトで調べてみるとこちらのサイトが見つかりました。
PHPのstream wrapperをさわってみた – おぎろぐはてな
こちらのサイトを見てみると
php://input は、POST の生データの読み込みを 許可します。
ほ~!そういうことですか?!けど、POSTの生データってどんなデータでしょうか?同サイトにはその生データを取得するためのソースが掲載されています。
<html>
<body>
<form method="POST">
<input name="first" type="text" />
<input name="second" type="text" />
<input type="submit" />
</form>
<?php
var_dump(file_get_contents("php://input"));
?>
</body>
</html>
このプログラムを実行すると2つのテキストボックスが表示されます。そのテキストボックスに適当な文字列を入れて「送信」ボタンを押すとその生データを見ることができます。

サンプルプログラムを実行して得たPOSTの生データ
なるほど生データというものはこういうものなんですね。実際に使うことがあるかわかりませんが、いい勉強になりました。