ホームページ >バックエンド開発 >PHPチュートリアル >PHPマスター| PHPでのストリームの理解

PHPマスター| PHPでのストリームの理解

Lisa Kudrow
Lisa Kudrowオリジナル
2025-02-23 10:38:14699ブラウズ

PHP Master | Understanding Streams in PHP

コアポイント

  • PHPストリーミングは、ファイル、ネットワーク、およびデータ圧縮操作を一般化するための強力なツールです。それらは線形に読み書きしたり、書かれたりすることができ、ストリーム内のどこでもfseek()にすることができます。各ストリームには、特定のプロトコルまたはエンコーディングを処理するためのラッパーがあります。
  • PHPは、組み込みのラッパー、プロトコル、フィルターを提供し、カスタムラッパー、プロトコル、フィルターの作成と登録を可能にします。デフォルトのラッパーはfile://です。これは、ファイルシステムにアクセスするたびに使用されます。その他のラッパーには、HTTP、Amazon S3、MS Excel、Googleストレージ、Dropbox、Twitterのラッパーが含まれます。
  • ストリームコンテキストは、ラッパーの動作を変更および強化できるストリーム固有のパラメーターまたはオプションです。これらは、単純なネットワーク操作でのカールの使用を回避するために使用でき、さまざまな目的で個別に変更または作成できます。ストリームを使用して、PAASプロバイダー向けの仮想ファイルシステムラッパーを作成し、カスタムファイル形式とエンコーディングを実装するアプリケーション用のカスタムラッパーとフィルターを構築するために使用できます。

PHPストリームはPHPが提供するリソースであり、頻繁に透過的に使用しますが、非常に強力なツールになることもあります。彼らの力を活用する方法を学ぶことで、アプリケーションをより高いレベルに引き上げることができます。 PHPマニュアルには、ストリーミングの適切な説明があります。簡単に言えば、ストリームはストリーミング可能な動作を示すリソースオブジェクトです。つまり、線形に読み書きしたり、書かれたりすることができ、ストリーム内のどこでもfseek()>できる場合があります。

各ストリームには、特定のプロトコルまたはエンコードを処理するために必要な追加のコードを含む実装ラッパーがあります。 PHPは、カスタムラッパーを簡単に作成および登録できる組み込みラッパーを提供します。コンテキストとフィルターを使用して、ラッパーの動作を変更または強化することもできます。

フローの基本

ストリームの参照形式は<scheme>://<target></target></scheme>です。 <scheme></scheme>はラッパーの名前であり、<target></target>はラッパーの構文によって異なります。デフォルトのラッパーはfile://です。つまり、ファイルシステムにアクセスするたびにストリームを使用します。たとえば、readfile('/path/to/somefile.txt')またはreadfile('file:///path/to/somefile.txt')を書き込み、同じ結果を得ることができます。代わりにreadfile('http://google.com/')を使用する場合、PHPにHTTPストリームラッパーを使用するように指示します。前述のように、PHPはいくつかの組み込みラッパー、プロトコル、およびフィルターを提供します。マシンにどのラッパーが取り付けられているかを理解するには、使用できます。

<code class="language-php"><?php
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());
?></code>
私のインストール出力は次のとおりです
<code class="language-php"><?php
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());
?></code>

良いツールのセットですね。さらに、Amazon S3、MS Excel、Google Storage、Dropbox、さらにはTwitterにサードパーティのストリームを作成または使用できます。

php:// wrapper

PHPには、言語のI/Oストリームにアクセスする独自のラッパーがあります。基本的なphp://stdinphp://stdout、およびphp://stderrラッパーがデフォルトのI/Oリソースをマッピングします。また、POSTリクエストの元の本文を備えた読み取り専用ストリームでもあります。これは、データペイロードをPOSTリクエスト本体内に配置するリモートサービスを扱う場合に非常に便利です。迅速なテストにカールを使用しましょう:php://input

<code>Array
(
    [0] => tcp
    [1] => udp
    [2] => unix
    [3] => udg
    [4] => ssl
    [5] => sslv3
    [6] => sslv2
    [7] => tls
)
Array
(
    [0] => https
    [1] => ftps
    [2] => compress.zlib
    [3] => compress.bzip2
    [4] => php
    [5] => file
    [6] => glob
    [7] => data
    [8] => http
    [9] => ftp
    [10] => zip
    [11] => phar
)
Array
(
    [0] => zlib.*
    [1] => bzip2.*
    [2] => convert.iconv.*
    [3] => string.rot13
    [4] => string.toupper
    [5] => string.tolower
    [6] => string.strip_tags
    [7] => convert.*
    [8] => consumed
    [9] => dechunk
    [10] => mcrypt.*
    [11] => mdecrypt.*
)</code>
PHPスクリプトに応じた

の結果は次のとおりです。 print_r($_POST)

最初のパケットには
<code class="language-bash">curl -d "Hello World" -d "foo=bar&name=John" http://localhost/dev/streams/php_input.php</code>
配列からアクセスできないことに注意してください。ただし、代わりに

を使用する場合、$_POSTを取得します。 readfile('php://input')

PHP 5.1では、一時的なデータを読み書きするための
<code class="language-php">Array
(
    [foo] => bar
    [name] => John
)</code>
および

ストリームラッパーを紹介します。名前が示すように、データは、それぞれ基礎となるシステムによって管理されているメモリまたは一時ファイルに保存されます。また、php://memoryphp://temp/php://filterなどの関数を使用して、ストリームを開くときにフィルターを適用するように設計されたメタラッパーreadfile()もあります。 file_get_contents() stream_get_contents()

最初の例では、フィルターを使用してディスクに書き込まれたデータをエンコードしますが、2番目の例では2つのカスケードフィルターを適用して、リモートURLからデータを読み取ります。結果は、アプリケーションで非常に基本的なものから非常に強力なものまでの範囲です。
<code>Hello World&foo=bar&name=John</code>

フローコンテキスト

コンテキストは、ラッパーの動作を変更および強化できるストリーム固有のパラメーターまたはオプションのセットです。一般的な使用コンテキストは、HTTPラッパーを変更することです。これにより、単純なネットワーク操作でCurlの使用を避けることができます。

最初に、フォーマット
<code class="language-php"><?php
// 写入编码数据
file_put_contents("php://filter/write=string.rot13/resource=file:///path/to/somefile.txt","Hello World");

// 读取数据并进行编码/解码
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.google.com");
?></code>
の配列であるオプションの配列を定義します(利用可能なコンテキストオプションは、特定のラッパーによって異なります)。次に、デフォルトのコンテキストを返し、適用するオプションのオプションの配列を受け入れる

を呼び出します。 $array['wrapper']['option_name']ステートメントは、これらの設定を使用してコンテンツを取得します。この例では、コンテンツはリクエストの本文で送信されるため、リモートスクリプトはstream_context_get_default()を使用して読み取ります。 readfile()を使用してヘッダーにアクセスして取得できます。 php://input apache_request_headers()デフォルトのコンテキストオプションを変更しましたが、単独で使用するための代替コンテキストを作成することもできます。

<code class="language-php"><?php
$opts = array(
    'http' => array(
        'method' => "POST",
        'header' => "Auth: SecretAuthToken\r\n" .
                    "Content-type: application/x-www-form-urlencoded\r\n" .
                    "Content-length: " . strlen("Hello World"),
        'content' => 'Hello World'
    )
);
$default = stream_context_get_default($opts);
readfile('http://localhost/dev/streams/php_input.php');
?></code>

結論
<code class="language-php">Array
(
    [Host] => localhost
    [Auth] => SecretAuthToken
    [Content-type] => application/x-www-form-urlencoded
    [Content-length] => 11
)</code>

現実の世界で流れの力をどのように使用しますか?他にどこに行くことができますか?ご覧のとおり、Streamsはファイルシステム関連の機能を共有しているため、HerokuやAppFogなどのHerokuまたはAppFogを使用したPAASプロビジョニングの最初の使用は、最初に使用されます。ほとんど努力しても、標準のホスティングサービスからこれらのクラウドサービスにアプリケーションを移植し、利点を享受できます。さらに、後続の投稿に表示します。カスタムファイル形式とエンコーディングを実装するアプリケーション用のカスタムラッパーとフィルターを構築できます。

(スペースの制限のため、FAQの部分はここで省略されています。)

以上がPHPマスター| PHPでのストリームの理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。