国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP中的Streams詳細介紹

PHP中的Streams詳細介紹

2020-08-09 22:57php中文網 PHP教程

這篇文章主要介紹了PHP中的Streams詳細介紹,本文介紹了Stream 基礎知識、php:// Streams包裝類、Stream上下文等內容,需要的朋友可以參考下

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。 按照下文所述的方式,可以查詢到本機所支持的包裝類:

 

復制代碼 代碼如下:

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

 

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

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

php:// Streams包裝類

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

 

在第一個例子中使用了一個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);

 

Streams結論

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 91麻豆精品国产91久久久资源速度 | 欧美日韩高清一区 | 久久这里只有国产精品 | 色精品 | 在线播放一区二区三区 | 欧美成人激情视频 | 日韩精品1区| 一级片在线播放 | 一本久道视频一本久道 | 偷自在线 | av网站地址 | 免费av观看 | 欧美日韩精品一区二区三区 | 在线播放国产一区二区三区 | av在线精品| 成人精品视频在线观看 | 午夜爱爱毛片xxxx视频免费看 | 中文字幕在线观看一区二区三区 | 美女视频一区 | 性欧美精品久久久久久久 | 久久久精品欧美 | 俺去俺来也在线www色官网 | 精品国产黄a∨片高清在线 黄色大片aaaa | 黄色小视频在线免费观看 | 午夜成人免费视频 | 成人片免费看 | 亚洲 精品 综合 精品 自拍 | 亚洲乱码国产乱码精品精98午夜 | 特黄一级 | 亚洲国产精品一区二区久久 | 国产精品99久久久久久www | 久久久美女| 黄色在线观看网址 | 久久99精品久久久 | 国产精品污www一区二区三区 | 日韩中文字幕在线免费观看 | 91视频免费看| 中文字幕一区二区三区四区五区 | 亚洲欧美在线观看视频 | 日韩一二三 | 中文字幕亚洲一区二区三区 |