PHPのお勉強!

PHP TOP

php://

php://さまざまな入出力ストリームへのアクセス

説明

PHP ではさまざまな入出力ストリームを提供しています。 これらを使うと、PHP 自身の入出力ストリームへのアクセスや 標準入出力と標準エラー出力のファイル記述子へのアクセス、 メモリやディスクを使ったテンポラリファイルストリームへのアクセスができ、 フィルタを使って他のファイルリソースの読み書きに手を加えることもできます。

php://stdin, php://stdout および php://stderr

php://stdinphp://stdout および php://stderr は、PHP プロセスの 対応する入出力ストリームへの直接アクセスを許可します。 これらのストリームは複製されたファイル記述子を参照します。そのため、 php://stdin をオープンしたあとでそれを閉じたとしても、 識別子のコピーが閉じられるだけです。STDIN で参照される実際のストリームは何も影響を受けません。 これらのラッパーを使うのではなく、定数 STDIN, STDOUT および STDERR を使用することを推奨します。

php://stdin は読み込み専用で、 php://stdout および php://stderr は書き込み専用です。

php://input

php://input は読み込み専用のストリームで、 リクエストの body 部から生のデータを読み込むことができます。 enable_post_data_reading オプションが有効になっている場合、 かつ enctype="multipart/form-data" を指定した POST リクエストでは、php://input は使用できません。

php://output

php://output は書き込み専用のストリームで、 print および echo と同じ方法での出力バッファへの書き込みを許可します。

php://fd

php://fd は、指定したファイル記述子に直接アクセスすることができます。 たとえば php://fd/3 は、ファイル記述子 3 を指します。

php://memory および php://temp

php://memory および php://temp は読み書き可能なストリームで、一時データをファイルのように保存できるラッパーです。 両者の違いは、 php://memory が常にデータをメモリに格納するのに対して php://temp は定義済みの上限 (デフォルトは 2 MB) に達するとテンポラリファイルを使うという点です。 このテンポラリファイルの場所は、 sys_get_temp_dir() 関数と同じ方法で決めます。

php://temp のメモリ制限を制御するには /maxmemory:NN を追加します。この NN はメモリに保持するデータの最大量で、単位はバイトです。 このサイズを超えるとテンポラリファイルを使います。

警告

PHP の拡張モジュールによっては、 標準入出力が必須なものがあるかもしれません。 その場合、指定されたストリームを標準入出力のストリームにキャストしようとするかもしれませんが、メモリに格納するストリームの場合、このキャストは失敗する可能性があります。なぜなら、C言語の fopencookie() 関数が使える必要があるからです。この関数は、Windows では 利用できません

php://filter

php://filter は、フィルタアプリケーションが ストリームをオープンすることを許可するために設計されたメタラッパーです。 これは、readfile()file() および file_get_contents() のようなオールインワンの ファイル関数とともに使用すると有用です。これらの関数には、コンテンツが 読み込まれる前にストリームにフィルタを適用する手段がありません。

php://filter の対象は、 次のようなパラメータをパスの一部として受け取ります。 ひとつのパスに対して複数のフィルタチェインを指定できます。 これらのパラメータの詳細は、使用例を参照ください。

php://filter のパラメータ
名前 説明
resource=<フィルタの対象となるストリーム> このパラメータは必須です。フィルタリングしたいストリームを指定します。
read=<読み込みチェーンに適用するフィルタのリスト> このパラメータは任意です。ひとつあるいは複数のフィルタ名を、 パイプ文字 (|) で区切って指定します。
write=<書き込みチェーンに適用するフィルタのリスト> このパラメータは任意です。ひとつあるいは複数のフィルタ名を、 パイプ文字 (|) で区切って指定します。
<両方のチェーンに適用するフィルタのリスト> read=write= がついていないすべてのフィルタは、読み込みと書き込みのチェーンの両方に適切に適用されます。

オプション

ラッパーの概要(php://filter については、 フィルタされる側のラッパーの概要を参照します)
属性 サポートの有無
allow_url_fopen で制約される No
allow_url_include で制約される php://inputphp://stdinphp://memory および php://temp のみ。
読み込み許可 php://stdinphp://inputphp://fdphp://memory および php://temp のみ。
書き込み許可 php://stdoutphp://stderrphp://outputphp://fdphp://memory および php://temp のみ。
追加許可 php://stdoutphp://stderrphp://outputphp://fdphp://memory および php://temp のみ (書き込みと同じ)。
同時読み書き許可 php://fdphp://memory および php://temp のみ。
stat() のサポート No. 但し、php://memory および php://temp は、fstat() をサポートしています。
unlink() のサポート No
rename() のサポート No
mkdir() のサポート No
rmdir() のサポート No
stream_select() のサポート php://stdinphp://stdoutphp://stderrphp://fd、および php://temp のみ。

例1 php://temp/maxmemory

このオプションパラメータは、php://temp がテンポラリファイルを使うようになるまでのメモリの制限を設定します。

<?php
// 制限を 5 MB にします。
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

fputs($fp, "hello\n");

// 書き込んだ内容を読み込みます。
rewind($fp);
echo
stream_get_contents($fp);
?>

例2 php://filter/resource=<フィルタの対象となるストリーム>

このパラメータは、 php://filter 指定の最後に存在し、フィルタリング したいストリームを指している必要があります。

<?php
/* これは単純に以下と同じです。
readfile("http://www.example.com");
なぜなら、実際のところ何のフィルタ処理も行われないからです。 */

readfile("php://filter/resource=http://www.example.com");
?>

例3 php://filter/read=<読み込みチェーンに適用するフィルタのリスト>

このパラメータは 1 つ以上のフィルタ名を パラメータとしてとり、それらはパイプ文字 | で区切られます。

<?php
/* これは、www.example.com のすべての内容を
大文字に変換して出力します。 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");

/* これは上の例と同じですが、それに加えて
ROT13 エンコード処理を行います。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

例4 php://filter/write=<書き込みチェーンに適用するフィルタのリスト>

このパラメータは 1 つ以上のフィルタ名を パラメータとしてとり、それらはパイプ文字 | で区切られます。

<?php
/* これは、文字列 "Hello World"
に対して rot13 フィルタを適用し、カレントディレクトリの
example.txt に書き込みます。 */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>

例5 php://memory と php://temp は再利用できない

php://memoryphp://temp の再利用はできません。つまり、いったんストリームを閉じてしまったら、もうそれを参照できないということです。

<?php
file_put_contents
('php://memory', 'PHP');
echo
file_get_contents('php://memory'); // 何も表示されません
add a note

User Contributed Notes

There are no user contributed notes for this page.