ストリームの概念は、UNIX のパイプの概念に由来しています。 UNIX では、パイプは中断のないバイト ストリームであり、プログラムまたはプロセス間の通信を実装したり、周辺デバイスや外部ファイルなどの読み書きに使用されます。ストリームの方向に応じて、入力ストリームと出力ストリームに分割することができ、同時にバッファ ストリームなどの他のストリームを周囲に配置して、より多くのストリーム処理方法を取得できます。
PHP のストリームと Java のストリームは実際には同じ概念ですが、少し単純になっています。 PHP は主に Web 開発に使用されるため、「フロー」という概念が言及されることはほとんどありません。 Java の基盤がある場合は、PHP のストリームを理解するのが簡単になります。実際、SPL、例外、フィルターなど、PHP の多くの高度な機能はすべて Java の実装を参照しており、同じ概念と原則を持っています。
たとえば、以下は PHP SPL 標準ライブラリの使用法です (ディレクトリを走査し、一定の条件でファイルを検索します):
リーリーJava にも同じコードがあります:
リーリーこの例を見ると、PHP と Java の概念が多くの点で同じであることがわかります。一方で、この例は、一方の言語を理解するのにも役立ちます。フィルターストリームは -filter と述べています。実際、それはデザインパターンの現れでもあります。
まず、いくつかの例を通してストリーム系列関数の使用法を理解します。
以下はソケットを使用してデータをキャプチャする例です:
リーリーこれを実現するには、stream_socket を使用することもできます。これは、ソケットを開くコードを次のように変更するだけです。
コードをコピーします コードは次のとおりです:
$fp = stream_socket_client("tcp://nowmagic.net:80", $errno, $errstr, 3);
file_get_contents 関数は通常、ファイルの内容を読み取るために使用されますが、この関数はリモート URL を取得するためにも使用でき、curl と同様の役割を果たします。
リーリー
3 番目のパラメーター $context は HTTP ストリーム コンテキストであり、file_get_contents 関数にアタッチされたパイプとして理解できることに注意してください。同様に、FTP ストリームとソケット ストリームを作成し、対応する関数に設定することもできます。stream_context_create の詳細については、「PHP 関数の完了: stream_context_create() は POST/GET をシミュレートする」を参照してください。
上記の 2 つのストリーム シリーズ関数は、特定のプロトコルの入力ストリームと出力ストリームに作用するラッパーのようなストリームです。この種の使用法と概念は、実際には Java のストリームとあまり変わりません。たとえば、Java は次のように記述します:
コードをコピーします コードは次のとおりです:
new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File(fileName))));
フィルターフローの機能を見てみましょう:
リーリー
上記の例では、フィルター タイプを STREAM_FILTER_ALL に設定すると、読み取りストリームと書き込みストリームに同時に作用し、読み取りデータと書き込みデータは rot13 フィルターによって処理され、読み取られるデータは私たちが書き込んだデータと同じです。元のデータは一貫しています。stream_filter_append の変数「string.rot13」がどこからともなく出てきたことに驚かれるかもしれません。これは実際には PHP の組み込みフィルターです。
次のメソッドを使用して、PHP 組み込みストリームを出力します:
リーリー
出力:リーリー
当然、独自のフィルターを定義することを考えますが、それは難しくありません。リーリー
注: フィルター名はお好みに合わせて選択できます。その後、カスタムフィルター「string.md5」を使用できるようになります。
このフィルターの書き方は少しわかりにくいように思えますが、実際には、php_user_filter クラスの構造と組み込みメソッドを確認するだけで理解できます。
フィルター ストリームに最も適しているのは、圧縮、エンコード、デコードなどを含むファイル形式の変換です。これらの「逸脱した」使用法に加えて、フィルター ストリームのより便利な場所の 1 つは、ソケットなどの関数のデバッグとログ記録です。開発中、ログ記録用のフィルター ストリームを登録します。たとえば、次の例:
リーリー
このフィルターは入力ストリームを処理するだけでなく、ログ記録用の関数をコールバックすることもできます。次のように使用できます:
コードをコピーします コードは次のとおりです:
stream_filter_prepend($fp, "string.md5", STREAM_FILTER_WRITE,$callback);
以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。