プログラミング始めて1か月の超初心者がPHP7技術者認定初級試験を受けてみたで勉強していたとき、ストリームという単語が出てきた。
file_get_contents() の第三引数にストリームコンテキストを渡すという話の中で。
その際にあまり理解できなかったので、自分なりに調べて、(正しいかどうかは別として)自分なりに理解した内容をまとめてみました。
私なりの理解
ストリーム
データが出入りする、メモリやファイル、ネットワーク等をプログラム中で扱えるように抽象化したもの。
ストリームラッパー
ただし、"ファイルとネット"のように異なるものでは扱い方が異なる。そこで、ストリームラッパーを使用して、file_get_contents() 等、同一の関数で、同様に扱えるようにしている。
ストリームコンテキスト
そして、実際にファイルやネットを扱う際に、どのように扱うのかを指定するのがストリームコンテキスト。
例えば、HTTP で扱うときには GET なのか POST なのかを指定したり、リクエストのヘッダを指定したりできる。
参考にさせていただいたもの
1. PHPマニュアル
ストリームは、 ファイル、ネットワーク、データ圧縮などに関する、 共通した一連の関数群と利用法を持つ操作の一般化の手法です。 もっとも単純な定義では、ストリーム というのは、ストリーミング可能な動作を体現する resource オブジェクトといえます。つまり、ストリームには線的に読み出したり、 あるいは書き込んだりすることが可能で、かつ、 ストリーム上の任意の場所に fseek() できる場合もあります。
……難しくてよくわかりません。
2. 初めてのPHP
PHPエンジンがプログラムとデータをやり取りするための基盤となる仕組みをストリームと呼びます。
……なんとなくわかった気になれる表現。
3. 「PHPストリーム概説」 hanawaさん
外部データに対するI/Oを透過的に扱う
何でもファイルのように扱える
……ちょっとずつ見えてきた気がします。
4. IBM チュートリアル「PHPの学習」
ファイルなどのリソースに実際にアクセスする方法は、ファイルが保管されている場所とファイルを保管する方法によって決まります。ローカルにあるファイルにアクセスする方法と、リモート・サーバー上にあるファイルに HTTP や FTP によってアクセスする方法は、まったく違います。
幸い、PHP では「ストリーム・ラッパー」を使用できます。たとえどこにあるリソースを呼び出したとしても、PHP で使用可能なラッパーがあれば、そのラッパーが呼び出し方法を見つけ出してくれます。
なるほど、ストリームラッパーについてイメージを掴めた気がします。
5. YYPHP#87「PhpStorm有効活用術」「自社サービス開発と受託開発の違いとは?」「ポートフォリオにどんな内容が必要?」「PHPのストリーム」
川からちょっとずつデータを取り出して処理するのがPHPのストリーム
PHPではfileの読み込みがストリーム処理
ストリームという名前の理由。
6. 【PHP】ストリームってなに?
入出力を扱う機能。
CSVを1行ずつ読み込んで、DBに保存したりするイメージ
※file_get_contensはPHPの関数としてはストリーム処理ではないが、file_get_contensの内部(C言語レベル)ではストリーム処理を行なっている(多分)。
fgetcsv() で一行ずつ読み込むイメージ。
file_get_contents() についても補足されています。
7. IT用語辞典
プログラミングの分野では、データの入出力全般を扱う抽象的なオブジェクトやデータ型を意味する場合が多い。データが出入りする何らかの対象(メモリ領域やファイル、ネットワークなど)をプログラム中で扱えるように抽象化したもので、接続や切断、書き込みや読み込みなどを簡易な操作で行うことができる。
オブジェクトだと思うとかなりスッキリするのですが、これで理解してしまって良いのでしょうか・・・?
さいごに
かなり勝手に納得した気になっていますが、これで正しいのかどうかは正直わかりません。
正しい理解をご指摘いただけますと大変助かります。
初めてのPHPを読んで詳細に調べたくなったところまとめでストリーム以外についてもまとめています。