PHP中的「流」(stream)簡介

如下內容整理添加自:php

Understanding Streams in PHPhtml

基礎

使用 <scheme>://<target> 的格式來進行stream的操做。apache

好比使用 file:// 協議來訪問文件系統api

readfile('/path/to/somefile.txt')
readfile('file:///path/to/somefile.txt')
//二者是等價的

查看本地PHP內置支持的協議和封裝協議,使用app

print_r(stream_get_wrappers());

返回curl

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
)

獲取本地的socket支持狀況和過濾器(用法在後面)支持狀況使用socket

print_r(stream_get_transports());
print_r(stream_get_filters());

將會返回tcp

Array
(
    [0] => tcp
    [1] => udp
    [2] => unix
    [3] => udg
    [4] => ssl
    [5] => sslv3
    [6] => sslv2
    [7] => tls
)   //transports

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

除此以外還有不少第三方庫能夠選擇:函數


php:// Wrapper

PHP://Wrapper 是PHP本身的I/O流訪問的封裝google

包括
- php://stdin
- 訪問PHP進程相應的輸入流,好比用在獲取cli執行腳本時的鍵盤輸入
- php://stdout
- 訪問PHP進程相應的輸出流
- php://stderr
- 訪問PHP進程相應的錯誤輸出
- php://input
- 訪問請求的原始數據的只讀流
- php://output
- 只寫的數據流,以 print 和 echo 同樣的方式寫入到輸出區
- php://fd
- 容許直接訪問指定的文件描述符。例 php://fd/3 引用了文件描述符 3
- php://memory
- 容許讀寫臨時數據。 把數據儲存在內存中
- php://temp
- 同上,會在內存量達到預約義的限制後(默認是 2MB)存入臨時文件中
- php://filter
- 過濾器

php://stdin 是隻讀的, php://stdout 和 php://stderr 是隻寫的。

直接上例子:

1 php://input

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

//print_r($_POST)輸出。注意丟失了第一個數據包

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

//php://input輸出

Hello World&foo=bar&name=John

2 使用過濾器

//在使用 readfile(),file_get_contents(),stream_get_contents()之類的函數使,能夠使用過濾器應用在打開的stream上

// 寫入時用 str_rot13() 函數處理全部的流數據
file_put_contents("php://filter/write=string.rot13/resource=file:///path/to/somefile.txt","Hello World");

//也能夠使用下面的方式
$h = fopen('test.txt', 'r');
stream_filter_append($h, 'string.rot13');

// Read data and encode/decode
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.google.com");

3 設置上下文(Stream Contexts)

$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',false,$default);
//咱們模擬了一個POST包
//查看 php_input.php 的 apache_request_headers() 會顯示結果

Array
(
    [Host] => localhost
    [Auth] => SecretAuthToken
    [Content-type] => application/x-www-form-urlencoded
    [Content-length] => 11
)
相關文章
相關標籤/搜索