亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

理解 PHP 中的 Streams

2019-11-08 01:21:41
字體:
來源:轉載
供稿:網友

Streams 是php提供的一個強有力的工具,我們常常在不經意會使用到它,如果善加利用將大大提高PHP的生產力。 駕馭Streams的強大力量后,應用程序將提升到一個新的高度。

下面是PHP手冊中對Streams的一段描述:

Streams 是在PHP 4.3.0版本被引入的,它被用于統一文件、網絡、數據壓縮等類文件的操作方式,為這些類文件操作提供了一組通用的函數接口。簡而言之,一個stream就是一個具有流式行為的資源對象。也就是說,我們可以用線性的方式來對stream進行讀取和寫入。并且可以用使用fseek()來跳轉到stream內的任意位置。

每個Streams對象都有一個包裝類,在包裝中可以添加處理特殊協議和編碼的相關代碼。PHP中已經內置了一些常用的包裝類,我們也可以創建和注冊自定義的包裝類。我們甚至能夠使用現有的context和filter對包裝類進行修改和增強。

Stream 基礎知識

Stream 可以通過<scheme>://<target>方式來引用。其中<scheme>是包裝類的名字,<target>中的內容是由包裝類的語法指定,不同的包裝類的語法會有所不同。

PHP默認的包裝類是file://,也就是說我們在訪問文件系統的時候,其實就是在使用一個stream。我們可以通過下面兩種方式來讀取文件中的內容,readfile('/path/to/somefile.txt')或者readfile('file:///path/to/somefile.txt'),這兩種方式是等效的。如果你是使用readfile('http://google.com/'),那么PHP會選取HTTP stream包裝類來進行操作。

正如上文所述,PHP提供了不少內建的包轉類,PRotocol以及filter。 按照下文所述的方式,可以查詢到本機所支持的包裝類:

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

提供的功能非常多,看上去還不錯吧?

除了上述內建的Stream,我們還可以為 Amazon S3, MS Excel, Google Storage, Dropbox 甚至Twitter編寫更多的第三方的Stream。

php:// 包裝類

PHP中內建了本語言用于處理I/O stream的包裝類。可以分為幾類,基礎的有php://stdin,php://stdout, 以及php://stderr,這3個stream分別映射到默認 的I/O資源。同時PHP還提供了php://input,通過這個包裝類可以使用只讀的方式訪問POST請求中的raw body。 這是一項非常有用的功能,特別是在處理那些將數據負載嵌入到POST請求中的遠程服務時。

下面我們使用cURL工具來做一個簡單的測試:

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

在PHP腳本中使用print_r($_POST)的測試結果如下所示:

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

我們注意$_POST array中是無法訪問到第一項數據的。但是如果我們使用readfile('php://input'),結果就不同了:

Hello World&#038;foo=bar&#038;name=John

PHP 5.1又增加了php://memory和php://tempstream這兩個包轉類,用于讀寫臨時數據。正如包裝類命名中所暗示的,這些數據被存儲在底層系統中的內存或者臨時文件中。 

php://filter是一個元包裝類,用于為stream增加filter功能。在使用readfile()或者file_get_contents()/stream_get_contents()打開stream時,filter將被使能。下面是一個例子:

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

在第一個例子中使用了一個filter來對保存到磁盤中的數據進行編碼處理,在二個例子中,使用兩個級聯的filter來從遠端的URL讀取數據。使用filter能為你的應用帶來極為強大的功能。

Stream上下文

context是一組stream相關的參數或選項,使用context可以修改或增強包裝類的行為。例如使用context來修改HTTP包裝器是一個常用到的使用場景。 這樣我們就可以不使用cURL工具,就能完成一些簡單的網絡操作。下面是一個例子:

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

首先要定義一個options array,這是個二位數組,可以通過$array['wrapper']['option_name']的形式來訪問其中的參數。(注意每個包裝類中context的options是不同的)。然后調用stream_context_get_default()來設置這些option,stream_context_get_default()同時還會將默認的context作為結果返回回來。設置完成后,接下來調用readfile(),就會應用剛才設置好的context來抓取內容。

在上面的例子中,內容被嵌入到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('http://localhost/dev/streams/php_input.php', false, $alternative);

結論

我們怎樣在現實世界中駕馭stream的強大力量呢?使用stream能為我們的程序帶來什么現實的好處? 正如前文介紹的那樣,stream對所有文件系統相關的功能進行了抽象,所以我第一個想到的應用場景是使用虛擬文件系統的包裝類來訪問PaaS供應商提供的服務,比如說訪問HeroKu或者AppFog,它們實際上都沒有真正文件系統。 使用stream只要對我們的應用程序稍作修改,就可以將其移植到云端。 接下來--在我的下一篇文章中--我將介紹如何編寫自定義的包裝類以實現對特殊文件格式和編碼格式的操作。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产精品久久精品| 国产精品普通话| 国产成人亚洲综合91精品| 国产主播在线一区| 亚洲美女精品久久| 亚洲欧美精品一区| 法国裸体一区二区| 亚洲成人网久久久| 亚洲欧美制服另类日韩| 日韩久久精品成人| 亚洲国产古装精品网站| 草民午夜欧美限制a级福利片| 欧美国产视频一区二区| 国产欧美中文字幕| 欧美亚洲在线观看| 最近2019年日本中文免费字幕| 欧美激情videos| 国产91精品高潮白浆喷水| 欧美小视频在线观看| 欧美精品18videosex性欧美| 日韩精品在线看| 精品久久香蕉国产线看观看gif| 欧美激情在线观看| 91国内揄拍国内精品对白| 一区二区三区视频免费| 国产成人精品免费久久久久| 国产欧美精品一区二区| 久久久久久伊人| 亚洲精品视频网上网址在线观看| 国产精品视频在线观看| 久久深夜福利免费观看| 欧美亚洲视频在线观看| 91av在线播放视频| 国产精品久久久久久久久久久久久| 国产丝袜一区二区三区| 日本国产高清不卡| 91老司机精品视频| 2019中文字幕全在线观看| 日韩经典中文字幕| 欧美在线性视频| 7777精品久久久久久| 午夜精品一区二区三区在线| 欧美又大又硬又粗bbbbb| 中日韩美女免费视频网站在线观看| 日本一区二区在线免费播放| 国产美女高潮久久白浆| 欧美人与性动交| 91亚洲国产成人久久精品网站| 色噜噜亚洲精品中文字幕| 91高清免费在线观看| 亚洲二区在线播放视频| 日韩麻豆第一页| 日韩国产精品亚洲а∨天堂免| 成人97在线观看视频| 国产欧美日韩亚洲精品| 超薄丝袜一区二区| 亚洲男人天堂九九视频| 日韩大片免费观看视频播放| 成人精品视频久久久久| 国产欧美精品久久久| 欧美日韩中文字幕| 日韩亚洲在线观看| 国产精品96久久久久久又黄又硬| 福利一区视频在线观看| 97精品一区二区三区| 亚洲人成欧美中文字幕| 日韩视频亚洲视频| 亚洲香蕉伊综合在人在线视看| 日韩中文在线中文网在线观看| 日本不卡免费高清视频| y97精品国产97久久久久久| 大荫蒂欧美视频另类xxxx| 亚洲激情在线观看| 日韩中文字幕亚洲| 日韩成人中文字幕在线观看| 亚洲一区二区三区毛片| 日韩在线欧美在线| 久久久久久久久综合| 国产精品啪视频| 懂色av影视一区二区三区| 亚洲精品福利在线观看| 一区二区三区无码高清视频| 亚洲精品国产精品乱码不99按摩| 国产精品精品久久久久久| 日韩电影视频免费| 精品久久久香蕉免费精品视频| 国产精品成人免费电影| 国产精品久久久久久久久久新婚| 日韩欧美在线视频日韩欧美在线视频| 日韩高清电影免费观看完整版| 91在线视频精品| 日韩美女av在线免费观看| 欧美香蕉大胸在线视频观看| 欧美亚洲国产另类| 欧美大片网站在线观看| 久久久国产视频91| 国产精品亚洲美女av网站| 在线丨暗呦小u女国产精品| 欧美日韩日本国产| 海角国产乱辈乱精品视频| 亚洲第一偷拍网| 久久久国产精彩视频美女艺术照福利| 国产亚洲在线播放| 亚洲精品永久免费| 26uuu亚洲国产精品| 亚洲视频网站在线观看| 国产精品日韩欧美大师| 午夜精品久久久久久久久久久久久| 一本大道亚洲视频| 欧美日韩一区二区精品| 国产一级揄自揄精品视频| 91理论片午午论夜理片久久| 国产精品美乳在线观看| 亚洲少妇中文在线| 日本亚洲欧洲色α| 亚洲国产精品高清久久久| 视频在线观看一区二区| 亚洲精品色婷婷福利天堂| 亚洲国产精品va在看黑人| 国产精品午夜视频| 91免费在线视频| 午夜精品久久久久久99热| 亚洲人成欧美中文字幕| 欧美日韩激情视频8区| 免费不卡欧美自拍视频| 91高潮在线观看| 中文字幕亚洲色图| 国产福利视频一区二区| 亚洲欧美中文日韩在线| 欧美三级欧美成人高清www| 国内外成人免费激情在线视频| 欧美在线国产精品| 黄色成人av网| 中文字幕视频一区二区在线有码| 久久精品国产亚洲一区二区| 69国产精品成人在线播放| 日韩在线观看高清| 国产精品久久久久久久电影| 国产视频久久网| 久久夜色精品国产亚洲aⅴ| 亚洲精品在线视频| 亚洲天堂网站在线观看视频| 91精品国产91久久久久久最新| 亚洲欧美日韩另类| 亚洲乱码一区二区| 一区二区av在线| 91免费精品国偷自产在线| 久久在精品线影院精品国产| 91亚洲精华国产精华| 久久69精品久久久久久久电影好| 日韩经典中文字幕在线观看| 欧美巨猛xxxx猛交黑人97人| 久久久久久久999| 国语自产精品视频在线看一大j8| 91av免费观看91av精品在线| 国产精品电影一区| 91成人免费观看网站| 欧美日韩一区二区精品| 韩剧1988免费观看全集| 国内偷自视频区视频综合| 欧美极品美女视频网站在线观看免费| 国内揄拍国内精品少妇国语| 亚洲国产欧美久久| 亚洲精美色品网站|