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

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

Jul 13, 2016 am 10:35 AM
php stream

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles