前往顾页
以后地位: 主页 > 收集编程 > Php实例教程 >

若何了解 PHP 中的 Streams

时候:2014-11-11 20:32来源:知行网www.zhixing123.cn 编辑:麦田守望者

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://谷歌.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.谷歌.com");

在第一个例子中利用了一个filter来对保存到磁盘中的数据进行编码措置,在二个例子中,利用两个级联的filter来从远端的URL读取数据。利用filter能为你的利用带来极其强年夜的服从。

顶一下
(1)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):php php教程 php实例教程 php5 php源代码 php根本教程 php技能 php6
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣