普京网址 1

下面是PHP手册中对Streams的一段描述普京网址

php:// 包装类

PHP中内建了本语言用于拍卖I/O
stream的包装类。能够分为几类,底蕴的有php://stdin,php://stdout,
以致php://stderr,那3个stream分别映射到私下认可的I/O财富。同一时间PHP还提供了php://input,通过那一个包裹类能够运用只读的办法访谈POST央求中的raw
body。
那是一项极度有效的功力,极度是在管理那么些将数据负载嵌入到POST央求中的远程服务时。

上面大家选择cUHavalL工具来做一个轻巧易行的测量检验:

curl -d "Hello World" -d "foo=bar&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&foo=bar&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来从远端的UHighlanderL读取数据。使用filter能为您的运用带来极为强盛的功能。

Stream 根底知识

Stream
能够通过<scheme>://<target>方式来援用。个中<scheme>是包装类的名字,<target>中的内容是由包装类的语法钦点,分歧的包装类的语法会有所不相同。

PHP暗中认可的卷入类是file://,也正是说大家在做客文件系统的时候,其实就是在采用一个stream。大家得以通过上边三种方法来读取文件中的内容,readfile(‘/path/to/somefile.txt’卡塔尔国可能readfile(‘file:///path/to/somefile.txt’State of Qatar,那二种艺术是一模二样的。假使您是运用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。

普京网址 1

Streams
是PHP提供的二个有力的工具,我们平常在不放在心上会使用到它,要是善加利用将大大提升PHP的坐褥力。
领悟Streams的无敌力量后,应用程序将升格到三个新的惊人。

各类Streams对象都有二个封装类,在卷入中得以增加管理非常左券和编码的相关代码。PHP中曾经嵌入了有些常用的卷入类,大家也能够创设和登记自定义的包装类。我们还是可以够使用现存的context和filter对包裹类举办更换和加强。

结论

小编们如何在实际世界中驾乘stream的强硬力量呢?使用stream能为大家的程序带给什么具体的功利?
正如前文介绍的那么,stream对具备文件系统相关的效用进行了思梅止渴,所以作者先是个想到的使用项景是利用设想文件系统的包装类来访问PaaS承包商提供的服务,譬喻说访问HeroKu或许AppFog,它们其实都不曾当真文件系统。
使用stream只要对大家的应用程序稍作修改,就可以将其移植到云端。
接下来–在小编的下一篇文章中–作者将介绍如何编写自定义的包装类以促成对独特文件格式和编码格式的操作。

Stream上下文

context是一组stream相关的参数或选择,使用context可以改进或升高包装类的行为。譬如使用context来改正HTTP包装器是二个常用到的施用情况。
那样大家就足以不选用cU卡宴L工具,就能够完结都部队分简短的网络操作。上边是贰个例证:

<?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(State of Qatar,就能够接纳刚才设置好的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);

下边是PHP手册中对Streams的一段描述:

Streams 是在PHP
4.3.0本子被引进的,它被用来统一文件、网络、数据压缩等类公事的操作办法,为这几个类公事操作提供了一组通用的函数接口。说来讲去,二个stream正是三个全部流式行为的财富对象。也正是说,大家能够用线性的不二诀要来对stream进行读取和写入。何况能够用利用fseek(State of Qatar来跳转到stream内的任性地点。

发表评论

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

相关文章