ホームページ  >  記事  >  バックエンド開発  >  PHPのStreamsツールの解析について

PHPのStreamsツールの解析について

不言
不言オリジナル
2018-06-21 10:21:361109ブラウズ

この記事では、主に PHP のパッケージ化クラスを扱うために使用される PHP の Streams ツールを紹介します。

Streams は、PHP が提供する強力なツールです。何気なく使ってしまいますが、うまく活用するとPHPの生産性が大きく向上します。 Streams のパワーを活用することで、アプリケーションを次のレベルに引き上げることができます。

以下は PHP マニュアルのストリームの説明です:

  • ストリームは PHP バージョン 4.3.0 で導入され、ファイル、ネットワーク、ネットワークを統合するために使用されます。データ圧縮などのクラス ファイルの操作モードは、これらのクラス ファイル操作に共通の関数インターフェイスのセットを提供します。つまり、ストリームはストリーミング動作を行うリソース オブジェクトです。言い換えれば、ストリームに対する読み取りと書き込みを線形に行うことができます。また、 fseek() を使用すると、ストリーム内の任意の位置にジャンプできます。

各 Streams オブジェクトにはラッパー クラスがあり、特別なプロトコルやエンコーディングを処理するための関連コードを追加できます。よく使用されるパッケージ クラスの一部は PHP に組み込まれており、カスタム パッケージ クラスを作成して登録することもできます。既存のコンテキストとフィルターを使用してラッパー クラスを変更および拡張することもできます。

ストリームの基本

ストリームは、e8ecf1fabecb2bbf3952eba1f0f8a7ec://b4bef09dd2761803871f1d83e55d08b2 を通じて参照できます。このうち、e8ecf1fabecb2bbf3952eba1f0f8a7ec はパッケージング クラスの名前で、b4bef09dd2761803871f1d83e55d08b2 の内容はパッケージング クラスの構文によって指定されます。

PHP のデフォルトのパッケージング クラスは file:// です。これは、ファイル システムにアクセスするときに実際にはストリームを使用することを意味します。ファイルの内容は、readfile('/path/to/somefile.txt') または readfile('file:///path/to/somefile.txt') の 2 つの方法で読み取ることができます。これらのメソッドは同等です。 。 readfile('http://google.com/') を使用すると、PHP は動作する HTTP ストリーム ラッパー クラスを選択します。

上で述べたように、PHP は多くの組み込みパッケージ クラス、プロトコル、フィルターを提供します。以下で説明する方法に従って、このマシンでサポートされているパッケージング クラスをクエリできます。

<?php
print_r(stream_get_transports());
print_r(stream_get_wrappers());
print_r(stream_get_filters());

私のマシンでの出力結果は次のとおりです。

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.*
)

は多くの機能を提供しており、かなり良さそうですよね?

上記の組み込みストリームに加えて、Amazon S3、MS Excel、Google Storage、Dropbox、さらには Twitter 用のサードパーティ ストリームを作成することもできます。

php:// ラッパー クラス

PHP には、この言語で I/O ストリームを処理するための組み込みラッパー クラスがあります。基本的なストリームは php://stdin、php://stdout、および php://stderr です。これらの 3 つのストリームはそれぞれデフォルトの I/O リソースにマップされます。同時に、PHP は php://input も提供します。これを介して、POST リクエストの生の本文に読み取り専用でアクセスできます。これは、特に POST リクエストにデータ ペイロードを埋め込むリモート サービスを扱う場合に、非常に便利な機能です。

以下では、cURL ツールを使用して簡単なテストを実行します。

curl -d "Hello World" -d "foo=bar&name=John" http://localhost/dev/streams/php_input.php

PHP スクリプトで print_r($_POST) を使用します。テスト結果は次のとおりです。

Array
(
  [foo] => bar
  [name] => John
)

$_POST 配列内のデータの最初の項目にアクセスできないことに注意してください。しかし、readfile('php://input') を使用すると、結果は異なります。

Hello World&foo=bar&name=John

PHP 5.1 では、php:/ が追加されます。パッケージクラス /memory および php://tempstream は、一時データの読み取りと書き込みに使用されます。ラッパー クラスの名前が示すように、このデータは基盤となるシステムのメモリまたは一時ファイルに保存されます。

php://filter は、ストリームにフィルター機能を追加するために使用されるメタパッケージング クラスです。フィルタは、readfile() または file_get_contents()/stream_get_contents() を使用してストリームを開くときに有効になります。以下は例です:

<?php
// Write encoded data
file_put_contents("php://filter/write=string.rot13/resource=file:///path/to/somefile.txt","Hello World");
 
// Read data and encode/decode
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.google.com");

最初の例では、ディスクに保存されたデータをエンコードするためにフィルターが使用されています。 2 つのカスケード フィルターを使用して、リモート URL からデータを読み取ります。フィルターを使用すると、アプリケーションに非常に強力な機能をもたらすことができます。

ストリーム コンテキスト

コンテキストは、ストリーム関連のパラメーターまたはオプションのセットであり、コンテキストを使用してラッパー クラスの動作を変更または強化します。たとえば、コンテキストを使用して HTTP ラッパーを変更することは、一般的に使用される使用シナリオです。このようにして、cURL ツールを使用せずにいくつかの単純なネットワーク操作を完了できます。以下は例です:

<?php
$opts = array(
 &#39;http&#39;=>array(
  &#39;method&#39;=>"POST",
  &#39;header&#39;=> "Auth: SecretAuthTokenrn" .
    "Content-type: application/x-www-form-urlencodedrn" .
       "Content-length: " . strlen("Hello World"),
  &#39;content&#39; => &#39;Hello World&#39;
 )
);
$default = stream_context_get_default($opts);
readfile(&#39;http://localhost/dev/streams/php_input.php&#39;);

まず、オプション配列を定義する必要があります。これは $array に渡すことができる 2 桁の配列です。 ['wrapper']['option_name'] パラメータにアクセスします。 (各ラッパー クラスのコンテキスト オプションは異なることに注意してください)。次に、stream_context_get_default() を呼び出してこれらのオプションを設定します。stream_context_get_default() も結果としてデフォルトのコンテキストを返します。設定が完了したら、readfile() を呼び出すと、設定したコンテキストがコンテンツのキャプチャに使用されます。

在上面的例子中,内容被嵌入到request的body中,这样远端的脚本就可以使用php://input来读取这些内容。同时,我们还能使用apache_request_headers()来获取request的header,如下所示:

Array
(
  [Host] => localhost
  [Auth] => SecretAuthToken
  [Content-type] => application/x-www-form-urlencoded
  [Content-length] => 11
)

在上面的例子中是修改默认context的参数,当然我们也可以创建一个新的context,进行交替使用。 

<?php
$alternative = stream_context_create($other_opts);
readfile(&#39;http://localhost/dev/streams/php_input.php&#39;, false, $alternative);

结论

我们怎样在现实世界中驾驭stream的强大力量呢?使用stream能为我们的程序带来什么现实的好处? 正如前文介绍的那样,stream对所有文件系统相关的功能进行了抽象,所以我第一个想到的应用场景是使用虚拟文件系统的包装类来访问PaaS供应商提供的服务,比如说访问HeroKu或者AppFog,它们实际上都没有真正文件系统。 使用stream只要对我们的应用程序稍作修改,就可以将其移植到云端。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于php_pdo 预处理语句的解析

PHP针对伪静态注入的解析

以上がPHPのStreamsツールの解析についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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