ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルでのストリームの使用法

php_PHP チュートリアルでのストリームの使用法

WBOY
WBOYオリジナル
2016-07-13 10:35:13815ブラウズ

Java では、ストリームは非常に重要な概念です。

ストリームの概念は、UNIX のパイプの概念に由来します。 UNIX では、パイプは中断のないバイト ストリームであり、プログラムまたはプロセス間の通信を実装したり、周辺デバイスや外部ファイルなどの読み書きに使用されます。ストリームの方向に応じて、入力ストリームと出力ストリームに分割することができ、同時にバッファ ストリームなどの他のストリームを周囲に配置して、より多くのストリーム処理方法を取得できます。

PHP のストリームと Java のストリームは実際には同じ概念ですが、少し単純になっています。 PHP は主に Web 開発に使用されるため、「フロー」という概念が言及されることはほとんどありません。 Java の基盤がある場合は、PHP のストリームを理解するのが簡単になります。実際、SPL、例外、フィルターなど、PHP の多くの高度な機能はすべて Java の実装を参照しており、同じ概念と原則を持っています。

たとえば、以下は PHP SPL 標準ライブラリの使用法です (ディレクトリを走査し、一定の条件でファイルを検索します):

コードをコピーします コードは次のとおりです:

class RecursiveFileFilterIterator extends FilterIterator
{
RecursiveFileFilterIterator
/** * $path を指定し、対応するディレクトリ イテレータを生成します

*/
public function __construct($path)
{
parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
}

/**

* ファイル拡張子が条件を満たしているか確認してください

*/
public function accept()
{
$item = $this->getInnerIterator();
if ($item->isFile() && in_array(pathinfo($item->) ; getFileName()、pathinfo_extension)、$ this-> ext))

//
foreach (new RecursiveFileFilterIterator('D:/history') as $item)
{
echo $item;
}


Java にも同じコードがあります:



コードをコピーします

コードは次のとおりです:


public class DirectoryContents
{
public static void main(String[] args) throws IOException
{
File f = new File("."); // 現在のディレクトリ

FilenameFilter textFilter = new FilenameFilter()
{
public boolean accept(File dir, String name)
{
String lowercaseName = name.toLowerCase();
if ( lowercaseName.endsWith(".txt"))
{
return true;
}
else
{
return false;
}
} }
};

File[] files = f.listFiles(textFilter);

for (ファイル file : files)
{
if (file.isDirectory())
{
System.out.print("directory:");
}
else
{
System.out.print(" ファイル: ");
}

System.out.println(file.getCanonicalPath());
}
}
}

この例は、PHP と Java の概念が多面的に同じであることを説明するものであり、理解するために非常に大きな助けとなります。一方、この例は次の点でも役立ちます。前述のフィルタ フロー フィルタも設計モードの 1 つです。

私たちは、最初にサンプルを通して、一連の関数の使用法を理解することができます。

次はソケットを使用してデータを取得する例です:

复制代码代码如下:
$post_ =array (
'author' => 'Gonn',
'mail'=>'gonn@nowmagic.net',
'url'= >'http://www.nowmagic.net/',
'text'=>'欢迎访问简明现代魔法');

$data=http_build_query($post_);$fp = fsockopen("nowmagic.net", 80, $errno, $errstr, 5);


$out="POST http://nowmagic.net/news/1/comment HTTP/1.1rn";

$out.="ホスト: typecho.orgrn";

$out.="ユーザーエージェント: Mozilla/ 5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13"."rn";
$out.="Content-type: application/x-www- form-urlencodedrn";
$out.="PHPSESSID=082b0cc33cc7e6df1f87502c456c3eb0rn";
$out.="Content-Length: " . strlen($data) 。 "rn";
$out.="接続: 近いnrn";
$out.=$data."rnrn";

fwrite($fp, $out);

while (!feof($fp))

{
echo fgets($fp, 1280);
}

fclose($fp);


私们も、stream_socket を使用して、これを実行することもできます。ソケットを開くだけで、次の番号にアクセスできます:

复制代码代码如下:
$fp = stream_socket_client("tcp://nowmagic.net:80", $errno, $errstr, 3);

ストリームの別の例を見てみましょう:

file_get_contents 関数は通常、ファイルの内容を読み取るために使用されますが、この関数はリモート URL を取得するためにも使用でき、curl と同様の役割を果たします。

コードをコピーします コードは次のとおりです:

$opts = array (
'http'=>array(
'method' => 'POST',
'header'=> "コンテンツ タイプ: application/x-www-form-urlencodedrn" .
"コンテンツの長さ: " . strlen($data) . "rn",
'content' =>
$context = stream_context_create($opts);file_get_contents('http://www.jb51.net/news', false, $context);



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)))));


フローの 1 つの層は、別のフローの層内にネストされます。これは、PHP のフローと同様です。

フィルターフローの機能を見てみましょう:

コードをコピーします コードは次のとおりです:
$fp = fopen('c:/test.txt', 'w+');

/* rot13 フィルターを書き込みストリームに適用します */stream_filter_append($fp, "string.rot13", STREAM_FILTER_WRITE);


/* 書き込まれたデータは rot13 フィルターによって処理されます*/

fwrite($fp, "This is a testn");

rewind($fp);

/* 書き込まれたデータを読み取り、一意性は当然処理された文字です */

fpassthru($fp);

fclose($fp);

// 出力: Guvf vf n grfg


上記の例では、フィルター タイプを STREAM_FILTER_ALL に設定すると、読み取りストリームと書き込みストリームに同時に作用し、読み取りデータと書き込みデータは rot13 フィルターによって処理され、読み取られるデータは私たちが書き込んだデータと同じです。元のデータは一貫しています。

stream_filter_append の変数「string.rot13」がどこからともなく出てきたことに驚かれるかもしれません。これは実際には PHP の組み込みフィルターです。

次のメソッドを使用して、PHP 組み込みストリームを出力します:

コードをコピーします コードは次のとおりです:
streamlist = stream_get_filters();
print_r($streamlist);


出力:

コードをコピーします コードは次のとおりです:
Array
(
[0] =>convert.iconv.*
[1] =>mcrypt.*
[2] => mdecrypt.*
[3] => string.toupper
[5] => string.strip_tags
[7] =>変換.*
[8] => 消費
[9] => デチャンク
[10] => bzip2.*
)


当然、独自のフィルターを定義することを考えますが、それは難しくありません。


コードをコピーします

コードは次のとおりです:

$ bucket-> data = md5($ bucket-> data);

cuse-off off-return psfs_pass_onを使用して使用します--- psfs_pass_on;
注: フィルター名はお好みに合わせて選択できます。

その後、カスタムフィルター「string.md5」を使用できるようになります。

このフィルターの書き方は少しわかりにくいように思えますが、実際には、php_user_filter クラスの構造と組み込みメソッドを確認するだけで理解できます。

フィルター ストリームに最も適しているのは、圧縮、エンコード、デコードなどを含むファイル形式の変換です。これらの「逸脱した」使用法に加えて、フィルター ストリームのより便利な場所の 1 つは、ソケットなどの関数のデバッグとログ記録です。開発中、ログ記録用のフィルター ストリームを登録します。たとえば、次の例:


コードをコピーします

コードは次のとおりです:


class md5_filter extends php_user_filter

{ Public function filter($in, $out, &$consumed, $closed)

{

$data="" ;

while ( $bucket = stream_bucket_make_writeable($in))

_bucket_append($out, $bucket) ;

}

call_user_func($this->params, $data);

return PSFS_PASS_ON;

$callback = function($data)

{ file_put_contents("c:log.txt",date("Y-m-d H:i")."rn");};
このフィルターは入力ストリームを処理するだけでなく、ログ記録用の関数をコールバックすることもできます。

次のように使用できます:




コードをコピーします

コードは次のとおりです:

stream_filter_prepend($fp, "string.md5", STREAM_FILTER_WRITE,$callback);




PHP のストリームシリーズ関数には、ラッパー クラス ストリーム streamWrapper という非常に重要なストリームもあります。ラッパー ストリームを使用すると、さまざまなタイプのプロトコルが同じインターフェイスを使用してデータを操作できるようになります。




http://www.bkjia.com/PHPjc/745822.html

www.bkjia.com

本当

http://www.bkjia.com/PHPjc/745822.html

技術記事

Java では、ストリームは非常に重要な概念です。 ストリームの概念は、UNIX のパイプの概念に由来します。 UNIX では、パイプはプログラムまたはプロセスの実装に使用されるバイトの途切れのないストリームです...

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