澳门新浦京娱乐游戏理解 PHP 中的 Streams

Streams
是PHP提供的一个强硬的工具,大家平常在不留意会选用到它,假如善加利用将大大提升PHP的临盆力。
明白Streams的刚劲才具后,应用程序将晋级到三个新的高度。

澳门新浦京娱乐游戏 1

上面是PHP手册中对Streams的大器晚成段描述:

Streams 是在PHP
4.3.0版本被引进的,它被用来统一文件、网络、数据压缩等类公事的操作形式,为这么些类公事操作提供了风流洒脱组通用的函数接口。综上所述,三个stream就是三个具备流式行为的财富对象。也正是说,大家得以用线性的主意来对stream举行读取和写入。何况能够用利用fseek(State of Qatar来跳转到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(‘
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:// 包装类

PHP中内建了本语言用于拍卖I/O
stream的包装类。可以分成几类,底蕴的有php://stdin,php://stdout,
以至php://stderr,那3个stream分别映射到暗中同意的I/O财富。同期PHP还提供了php://input,通过这几个包裹类能够应用只读的艺术访谈POST必要中的raw
body。
那是生龙活虎项特别平价的功用,非常是在管理那多少个将数据负载嵌入到POST央求中的远程服务时。

下边我们运用cU翼虎L工具来做二个简约的测试:

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’State of Qatar,结果就区别了:

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

PHP
5.1又扩大了php://memory和php://tempstream那七个包转类,用于读写有的时候数据。正如包装类命名中所暗暗表示的,那么些数据被积攒在后面部分系统中的内部存储器仍旧一时文件中。

php://filter是多个元包装类,用于为stream扩大filter效率。在应用readfile(State of Qatar恐怕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来从远端的UTiggoL读取数据。使用filter能为你的施用带给极为强盛的作用。

Stream上下文

context是黄金年代组stream相关的参数或选取,使用context能够修正或加强包装类的行为。举例利用context来改善HTTP包装器是四个常用到的运用情状。
那样大家就能够不选拔cUHavalL工具,就能够达成都部队分差相当的少的互连网操作。下边是一个例子:

<?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只要对大家的应用程序稍作修改,就足以将其移植到云端。
接下来–在自己的下风华正茂篇文章中–小编将介绍如何编写自定义的包装类以落实对特出文件格式和编码格式的操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注