PHPストリームStreams、包装器wrapperの概念と使用例の詳細

7819 ワード

この例では、PHPストリームStreams、パッケージwrapperの概念と使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
ストリームストリームストリームという概念はphp 4である.3導入されたのは、対流式データの抽象であり、ファイルデータ、ネットワークデータ、圧縮データなどのデータ操作を統一し、同じ関数を共有できるようにするために使用され、phpのファイルシステム関数はこのような共有であり、例えばfile_get_contents()関数でローカルファイルを開くこともurlにアクセスすることもできます.簡単に言えば、ストリームはストリームデータの動作を示すリソースオブジェクトです.
リニア方式で読み書きを行い、ストリーム内の任意の位置で検索することができます.
ストリームはデータベース抽象層に似ています.データベース抽象層では、どのデータベースを使用しても、抽象層の上で同じ方法でデータを操作しますが、ストリームはデータの抽象であり、ローカルファイルでもリモートファイルでも圧縮ファイルでも、ストリームデータだけが来るので、操作方法は同じです.
ストリームという概念があれば、包装器wrapperという概念を引き出し、各ストリームは1つの包装器に対応し、ストリームは統一操作という角度から生まれた概念であり、包装器はストリームデータの内容を理解することから生まれた概念であり、つまりこの統一操作方式がどのように異なる内容を操作したり配置したりするかである.
これらの内容はすべてストリームの方式で現れて、しかし内容の規則は異なって、例えばhttpプロトコルの伝達するデータはストリームの方式で、しかしhttp包装器だけがhttpプロトコルの伝達するデータの意味を理解して、このように理解することができて、ストリームは1本の流水のパイプで、ただそれが流出するのはデータで、包装器はストリームのこのパイプの外層の1つの解釈者にカバーして、流出したデータの意味を理解し、操作することができます.
公式マニュアルによると、「パッケージは、ストリームが特殊なプロトコルやコードをどのように処理するかを示す付加コードです」という意味が分かりますか?
包装器はネストすることができて、1つのストリームの外で1つの包装器を包んだ後に、また外層で包装器を包み続けることができて、この時中層の包装器は外層の包装器に対してストリームの役割を果たしてphp自身の下層で実現するc言語の開発ドキュメントはこのような解釈があります:
ストリームAPI操作の一対の異なるレベル:apiは基本レベルでphp_を定義するstreamオブジェクトはストリームデータソースを表し、apiはphp_を定義します.stream_wrapperオブジェクト.
低レベルのphp_を包みますstreamオブジェクトは、URLの内容とメタデータを取り戻し、コンテキストパラメータを追加する能力を提供し、パッケージの動作を調整します.
それぞれのストリームが開くと任意の数のフィルタを適用することができ,ストリームデータはフィルタの処理を経ているが,筆者はフィルタという言葉が少し不正確で,誤導的であると考えている.
字面の意味から見ると、いくつかのデータを削除したような感じがします.データ調整器と呼ぶべきです.それはいくつかのデータを削除したり、追加したり、修正したりすることができますが、歴史的な原因は俗成で、フィルタと呼ばれています.
私たちはよく次の言葉を見て、彼らの違いを説明します.
資源とデータ:資源は比較的にマクロ的な言い方で、通常データを含んで、データは比較的に具象的な言い方で、プログラムを開発する時よくデータだと言って、ソフトウェア計画の時に資源だと言って、彼らは類義語で、ソフトウェア設計とプログラム開発の違いのようです.
コンテキストとパラメータ:コンテキストは比較的にマクロ的な言い方で、よくコミュニケーションの上で使って、具体的な点は一回のコミュニケーション自身のパラメータで、パラメータという言い方は往々にして比較的に具体的な事の上で使って、例えば関数
概念的なものを説明しましたが、具体的な内容を見てみましょう.
phpでサポートされているプロトコルとパッケージはこちらをご覧ください.http://php.net/manual/zh/wrappers.php:元タイトルは:サポートされているプロトコルとパッケージプロトコルです.中国語の翻訳は少し誤導しています.正確にはサポートされているプロトコルとパッケージで、英語のレイアウトからよく分かります.デフォルトではいくつかのプロトコルとパッケージがサポートされています.stream_get_wrappers()関数で見てください.パッケージをカスタマイズしてstream_を使用することもできますwrapper_register()登録RFC 3986では使用できます:分割記号をしますがphpでは//しか許可されていませんのでurlを使用してください」scheme://target」というフォーマット
file://――ローカルファイルシステムにアクセスし、ファイルシステム関数を使用する場合、デフォルトではこのパッケージhttp://―HTTP(s)URL ftp://―FTP(s)URLs php://―各入出力ストリーム(I/O streams)zlib://―圧縮ストリームdata://―データにアクセスする(RFC 2397)glob://一致するファイルパスパターンphar://PHPアーカイブssh 2://Secure Shell 2 rar://RAR ogg://オーディオストリームexpect://インタラクティブなストリームを処理
カスタムパッケージを実装する方法:
fopen、fwrite、fread、fgets、feof、rewind、file_でput_contents、file_get_contentsなどのファイルシステム関数がストリームを操作する場合、データは定義されたパッケージクラスオブジェクトに渡され、パッケージはストリームを操作します.カスタムフローパッケージを実現するにはどうすればいいですか?phpはクラスプロトタイプを提供しています.プロトタイプだけで、インタフェースでもクラスでもありません.継承には使用できません.

streamWrapper {
/*    */
public resource $context ;
/*    */
__construct ( void )
__destruct ( void )
public bool dir_closedir ( void )
public bool dir_opendir ( string $path , int $options )
public string dir_readdir ( void )
public bool dir_rewinddir ( void )
public bool mkdir ( string $path , int $mode , int $options )
public bool rename ( string $path_from , string $path_to )
public bool rmdir ( string $path , int $options )
public resource stream_cast ( int $cast_as )
public void stream_close ( void )
public bool stream_eof ( void )
public bool stream_flush ( void )
public bool stream_lock ( int $operation )
public bool stream_metadata ( string $path , int $option , mixed $value )
public bool stream_open ( string $path , string $mode , int $options , string &$opened_path )
public string stream_read ( int $count )
public bool stream_seek ( int $offset , int $whence = SEEK_SET )
public bool stream_set_option ( int $option , int $arg1 , int $arg2 )
public array stream_stat ( void )
public int stream_tell ( void )
public bool stream_truncate ( int $new_size )
public int stream_write ( string $data )
public bool unlink ( string $path )
public array url_stat ( string $path , int $flags )
}


この原型の中で定義する方法は、自分の必要に応じて定義され、すべての実現を要求しない.これはなぜインタフェースとして定義されないのか.いくつかの実現にはいくつかの方法が必要ではないため、包装器が削除目録rmdir機能をサポートしていないなど、多くの柔軟性をもたらす.streamWrapper::rmdir
は実現していないため、ユーザがパッケージ上でrmdirを呼び出すとエラーが投げ出され、このエラーをカスタマイズするには、それを実装し、内部でエラーを投げ出すstreamWrapperも事前定義クラスではなく、テストclass_exists("streamWrapper")は、開発者を指導するプロトタイプにすぎないことを知っています.
公式マニュアルには、次の例があります.http://php.net/manual/zh/stream.streamwrapper.example-1.php
このブログでは、drupal 8システムから修正されたパッケージを抽出する例を示します.drupal 8ソース分析を参照してください.ストリームの一部について
ストリームシリーズ関数、公式マニュアル:http://php.net/manual/zh/ref.stream.php
一般的な関数は次のとおりです.
stream_bucket_append関数:キューにデータstreamを追加するbucket_make_writeable関数:操作されたキューからデータオブジェクトstream_を返します.bucket_新関数:現在のキューに新しいデータstream_を作成bucket_prepend関数:キューstream_にデータを予備context_create関数create関数:データストリームコンテキストstream_を作成するcontext_get_default関数:デフォルトのデータストリームコンテキストstream_を取得context_get_options関数:データストリームの設定stream_を取得するcontext_set_option関数:データストリーム、パケット、またはコンテキストをstream_に設定します.context_set_params関数:データストリーム、パケット、またはコンテキストにパラメータstreamを設定します.copy_to_stream関数:データストリーム間でレプリケーション操作stream_filter_append関数:データストリームにフィルタstreamを追加するfilter_prepend関数:データストリームにフィルタstream_を追加するfilter_register関数:データストリームのフィルタを登録し、PHPクラスとしてstream_を実行します.filter_remove関数:フィルタstreamをデータストリームから除去するget_contents関数:データストリームの残りのデータを文字列stream_に読み出すget_filters関数:登録されたデータストリームフィルタリストstream_を返します.get_line関数:指定されたデリミタに従ってデータストリームリソースから行stream_を取得get_meta_data関数:カプセル化プロトコルファイルポインタからヘッダ/メタデータstream_を取得get_Transports関数:登録されたSocket転送リストstreamを返します.get_wrappers関数:登録されたデータストリームリストstream_を返します.register_wrapper関数:PHPクラスで実装されたURLパッケージプロトコルstream_を登録select関数:データストリーム配列を受信し、ステータスの変更を待つstream_set_blocking関数:データストリームを詰まった状態または非詰まった状態streamに設定します.set_timeout関数:データストリームのタイムアウト設定stream_set_write_buffer関数buffer関数:データストリームのバッファstream_を設定するsocket_accept関数:関数stream_を受け入れるsocket_サーバ()で作成したSocket接続stream_socket_Client関数:ネットワークまたはUNIXホストのSocket接続stream_を開くsocket_enable_crypto関数:接続されたSocketのデータ暗号化stream_をオンまたはオフにします.socket_get_name関数:ローカルまたはネットワークソケットの名前stream_を取得socket_pair関数:2つの区別のないSocketデータストリーム接続stream_を作成するsocket_recvfrom関数:接続の有無にかかわらずSocketからデータを取得しますstream_socket_sendto関数:接続の有無にかかわらずSocketにデータを送信するstream_socket_server関数:ネットワークまたはUNIX Socketサービス側streamを作成します.wrapper_restore関数:事前にログアウトしたパケットstreamを復元します.wrapper_unregister関数:URLアドレスパッケージをログアウトする
フィルタの列と説明:
公式サイト関連リンク:
ユーザーフィルタベースクラス:http://php.net/manual/zh/class.php-user-filter.phpフィルタ登録:http://php.net/manual/zh/function.stream-filter-register.php

data = strtoupper($bucket->data);
   $consumed += $bucket->datalen;
   stream_bucket_append($out, $bucket); //              
  }
  return PSFS_PASS_ON;
 }
}
/*       php */
stream_filter_register("strtoupper", "strtoupper_filter")
  or die("Failed to register filter");
$fp = fopen("foo-bar.txt", "w");
/*           */
stream_filter_append($fp, "strtoupper");
fwrite($fp, "Line1
"); fwrite($fp, "Word - 2
"); fwrite($fp, "Easy As 123
"); fclose($fp); // readfile("foo-bar.txt"); ?>

PHPに関する詳細について興味のある読者は、「PHP基本文法入門教程」、「PHP演算と演算子用法総括」、「php対象向けプログラム設計入門教程」、「PHPネットワークプログラミング技術総括」、「php文字列(string)用法総括」、「php+mysqlデータベース操作入門チュートリアル」および「php一般データベース操作テクニック要約」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.