资讯专栏INFORMATION COLUMN

PHP中的“流”(stream)简介

kid143 / 1598人阅读

摘要:例引用了文件描述符允许读写临时数据。注意丢失了第一个数据包输出使用过滤器在使用,,之类的函数使,可以使用过滤器应用在打开的上写入时用函数处理所有的流数据也可以使用下面的方式设置上下文我们模拟了一个包查看的会显示结果

以下内容整理添加自:

Understanding Streams in PHP

基础

使用 :// 的格式来进行stream的操作。

比如使用 file:// 协议来访问文件系统

readfile("/path/to/somefile.txt")
readfile("file:///path/to/somefile.txt")
//两者是等价的

查看本地PHP内置支持的协议和封装协议,使用

print_r(stream_get_wrappers());

返回

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支持情况和过滤器(用法在后面)支持情况使用

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

将会返回

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

除此之外还有很多第三方库可以选择:

Amazon S3

MS Excel

Google Storage

Dropbox

Twitter


php:// Wrapper

PHP://Wrapper 是PHP自己的I/O流访问的封装

包括
- 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
)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20622.html

相关文章

  • Java8特性②Stream简介

    摘要:元素序列流也提供了一个接口,可以访问特定元素类型的一组有序值。因为集合是数据结构,所以它的主要目的是以特定的时间空间复杂度存储和访问元素如与。请注意,从有序集合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。 流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。可以把它们看成遍历数据集的高级迭代器。此外...

    EasonTyler 评论0 收藏0
  • PHP回顾之

    摘要:本文先简要跟踪底层流的原理,再回到用户态中流的使用。底层流我们知道中的函数可以打开本地文件等并返回一个句柄,函数能对资源句柄进行读写,用于关闭资源。更多关于底层流的操作可参考官方文档中开发者的流章节,本文不再深入。 转载请注明文章出处: https://tlanyan.me/php-review... PHP回顾系列目录 PHP基础 web请求 cookie web响应 sessi...

    gself 评论0 收藏0
  • Node_模块

    摘要:当某个执行完毕时,将以时间的形式通知执行操作的线程,线程执行了这个事件的回调函数。为了处理异步,线程必须有事件循环,不断的检查是否有未处理的时间。这种处理机制,称为事件环机制。方面使用第三方模块。 简介 V8引擎本身就是用于Chrome浏览器的JS解释部分,但是Ryan Dahl,把V8搬到服务器,用于做服务器的软件。Node是一个专注于实现高性能Web服务器优化的专家,在遇到V8而诞...

    zero 评论0 收藏0
  • Java8-

    摘要:因此,使用并行流需要考虑以下几点数据量将问题分解之后并行化处理,再将结果合并会带来额外的开销。 目录 简介 用法 例子 注意点 一. 简介 流是Java8引入的一个新特性,提供了对集合元素一系列便捷的操作,可以用很少的代码实现复杂的功能。流有两大类,分别是对象流(Stream),基本数据流(IntStream、LongStream、DoubleStream)。 二.用法 流的使用通...

    whinc 评论0 收藏0
  • PHP 网络编程小白系列 —— Socket 编程入门

    摘要:在这个时刻,服务程序被惊醒并且为客户提供服务对客户的请求作出适当的反应。为了方便这种模型的网络编程,年代初,由联合了其他几家公司共同制定了一套下的网络编程接口,即规范,它不是一种网络协议而是一套开放的支持多种协议的下的网络编程接口。 这篇文章将会介绍一下 Socket 编程中相关的 PHP 函数,并简单实现一个 C/S 的交互 Socket 简介 Socket 的官方解释:在网络编程中...

    DevWiki 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<