PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのphp://ストリームラッパーとは?種類と使い方を実例付きで解説

はじめに

php:// は、PHPに組み込まれているストリームラッパーの一種で、さまざまなI/O(入出力)ストリームへのアクセスを可能にします。標準入力・標準出力・標準エラー出力といった標準ストリームはもちろん、メモリ上のストリームやディスクベースの一時ファイルストリーム、さらにフィルタ処理が可能なストリームにも対応しています。

本記事では、php://系ラッパーそれぞれの役割と、実際のコード例を交えてわかりやすく解説します。

主なphp://ラッパーの種類

標準ストリーム(php://stdin / php://stdout / php://stderr)

php://stdinphp://stdoutphp://stderr を使うと、PHPプロセスの標準入力デバイス、標準出力ストリーム、標準エラー出力ストリームにそれぞれ直接アクセスできます。

これらには、あらかじめ定義されている定数 STDINSTDOUTSTDERR 経由でもアクセス可能です。CLIスクリプトでユーザー入力を受け取ったり、ログをエラー出力に書き込んだりする際に活用されます。

php://input

php://input は、HTTPリクエストボディに含まれる生データ(rawデータ)を読み取り専用で取得できるラッパーです。かつては同じデータが $HTTP_RAW_POST_DATA 変数からも参照できましたが、この変数は現在非推奨となっているため、php://input の利用が推奨されています。

なお、フォームの enctype 属性が multipart/form-data に設定されている場合、php://input は利用できない点に注意してください。

php://output

php://output は書き込み専用のストリームです。print 文や echo 文と同様の出力バッファ機構を提供し、関数経由で出力内容を制御したい場合に便利です。

php://fd

php://fd を使うと、ファイルディスクリプタ(ファイル記述子)に直接アクセスできます。標準ストリームの STDIN、STDOUT、STDERR にはそれぞれ 1、2、3 のファイルディスクリプタが割り当てられており、それ以降のストリームには連番で番号が振られていきます。たとえば php://fd/5 は、ファイルディスクリプタ5を参照します。

php://memory と php://temp

php://memory は読み書き両対応のストリームで、データを一時的にメモリ上へ保存できます。類似の php://temp も読み書き可能ですが、こちらはメモリではなく一時ファイルにデータを保存する点が異なります。大量のデータを扱う場合は、メモリ消費を抑えられる php://temp の方が適しています。

php://filter

php://filter は、ストリームを開くタイミングでフィルタを適用できる強力なラッパーです。readfile()file_get_contents()file() などの関数と組み合わせることで、読み込み時に文字コード変換や圧縮展開などの加工を行えます。

使用例

標準入出力を使った例

次の例では、コンソールからの入力を php://stdin で読み込み、その内容を php://stdout へ出力しています。

<?php
$file = fopen("php://stdin", "r");
$x = fread($file, 10);
echo $x;
$out = fopen("php://stdout", "w");
fwrite($out, $x);
fclose($file);
?>

php://input でPOSTデータを取得する例

php://input を使うと、HTTPリクエストの生データをそのまま取得できます。以下は、HTMLフォームからPOSTメソッドでデータを送信する例です。

<html>
<body>
<form action="testscript.php" method="POST">
    <input type="text" name="name">
    <input type="text" name="age">
    <input type="submit" value="submit">
</form>
</body>
</html>

受信側のPHPスクリプトでは、次のようにして生のHTTPデータを取得できます。

<?php
$json = file_get_contents("php://input");
$data = json_decode($json);
print_r($json);
?>

このように php://input は、JSON形式のAPIリクエストなど、通常の $_POST では受け取れない形式のデータを扱う際に特に有用です。

  1. PHPのpi()関数とは?使い方と定義済み定数との対応を実例付きで解説

    pi()関数の定義と使い方PHPのpi()関数は、数学定数π(円周率)の値を返す関数です。戻り値はfloat型の「3.14159265359」であり、PHPにあらかじめ定義されている定数M_PIとまったく同じ値になります。構文pi ( void ) : floatパラメータこの関数は引数を受け取りません。引数なしでそのまま呼び出すことができます。戻り値pi()関数は数学定数πの値を返し、定義済みの数学定数M_PIと等価です。数式の中では、M_PIの代わりにpi()関数を使うこともできます。対応するPHPバージョンこの関数はPHP 4.x、PHP 5.x、PHP 7.xのすべてのバージョンで利用

  2. Java Stream API入門:ストリームの特徴と基本的な使い方を実例で解説

    JavaのStream(ストリーム)は、データソースから取り出したオブジェクトのシーケンス(連続した列)を表し、集計操作(アグリゲート操作)をサポートする仕組みです。Java 8で導入されて以来、コレクション操作を簡潔かつ宣言的に記述できる手段として広く活用されています。ここでは、Streamの主な特徴と、実際のコード例を通じてその使い方を解説します。Streamの主な特徴1. 要素のシーケンスストリームは、特定の型の要素を順番に提供します。要素は必要に応じて取得・計算され、ストリーム自体が要素を保存することはありません。2. データソースストリームは、コレクション(Collections)、