PHP Stream API初探

和SPL一样,在PHP手册里面,被划为“other basic extensions”里面,是PHP开发中一个容易被忽视的函数系列。但其实在C++/Java中,流是一个很重要的概念。流的概念源于UNIX中的管道,管道是一条不间断的字节流,用来实现程序和进程间通信,或者读写外设,外部文件等。

流的概念是在php 4.3.0中被引入的。我们知道,文件操作,网络操作,数据压缩操作等具有一定的共性,比如线性的读/写或者随机定位,流就是用来把这些操作抽象出一个统一的接口以供开发者们使用,因此“流”被定义为a resource object which exhibits streamable behavior。

当然,我们可以对stream进行进一步的封装(wrapper),这样就可以handle一些特定的协议。例如http wrapper可以把一个url翻译成对远程服务器上文件的HTTP/1.0请求。PHP默认已经实现了很多wrappers,可以用过stream_get_wrappers()来得到这个列表

stream wrapper的好处是使得开发者使用统一的接口来打开一个像URL,FTP之类的连接,而不需要关心协议的内容,除非自己实现一个php wrapper。

当然,除了这些内置的php stream wrappers以外,我们可以增加自定义的流,添加的方式有两种

  • 通过php脚本stream_wrapper_register()来实现
  • 通过调用php stream API来编写C扩展实现。

流的使用方式为scheme://target,其中 scheme为wrapper的名称(例如http),target取决于一个具体的stream.

那么php stream到底有哪些应用场景呢?

task: 将一个用BZ2格式压缩的文件,将其编码格式从ISO-8859-1转至UTF-8,将全文转成大写,然后进行ROT-13编码,再写入一个新的文件。

如果对php stream有简要的了解以后,这个任务会非常容易

<?php
/**
 * Example of stream filtering.
 */

// Open two file handles.
$in = fopen(‘test.txt.bz2‘, ‘rb‘);
$out = fopen(‘test-uppercase.txt‘, ‘wb‘);

// Add a decode filter to the first.
stream_filter_prepend($in, ‘bzip2.decompress‘, STREAM_FILTER_READ);

// Change the charset from ISO-8859-1 to UTF-8
stream_filter_append($out, ‘convert.iconv.ISO-8859-1/UTF-8‘, STREAM_FILTER_WRITE);

// Uppercase the entire string.
stream_filter_append($out, ‘string.toupper‘, STREAM_FILTER_WRITE);

// Run ROT-13 on the output.
stream_filter_append($out, ‘string.rot13‘, STREAM_FILTER_WRITE);

// Now copy. All of the filters are applied here.
stream_copy_to_stream($in, $out);

// Clean up.
fclose($in);
fclose($out);
?>

这是因为php stream中一个特性-filter,其可以对流按照想要的方式进行过滤。php有一些内置的过滤器,可以通过stream_get_filters()来查看

当然,stream wrapper也提供了API让开发者自己开发一些filter。

PHP Stream API初探

时间: 2024-10-07 11:06:16

PHP Stream API初探的相关文章

Java 8新特性之旅:使用Stream API处理集合

在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda表达式增强方法”中,我已经深入解释并演示了通过lambda表达式和方法引用来遍历集合,使用predicate接口来过滤集合,实现接口的默认方法,最后还演示了接口静态方法的实现. 源代码都在我的Github上:可以从 这里克隆. 内容列表 使用流来遍历集合. 从集合或数组创建流. 聚合流中的值. 1.

Java 8: Lambdas和新的集合Stream API

Lambda是Java8的主要特色,Java 8: Lambdas & Java Collections | zeroturnaround.com一文介绍了使用Lambda集合处理大量数据的方法. 首先Java集合引入了内部遍历,原来 LambdaJ下面这种方法也可以在Java8中实现: List<Person> persons = asList(new Person("Joe"), new Person("Jim"), new Person(&

Atitit 实现java的linq 以及与stream api的比较

1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1.3. Java中的linq1 Linq来源于sql,而我们知道在数据查询领域,sql是标准化的一个dsl.. 1.1. Linq 和stream api的关系,以及主要优缺点 Stream更加的通用化,linq比较专一化,专注于数据查询的dsl..Linq就是特殊化的stream.. 此外,linq更加的dsl ,更加方便简洁.. stream相对底层一些,更加灵活,但

第二章 Stream API

引例: 1 List<String> strList = Arrays.asList("zhaojigang","nana","tianya","nana"); 2 Stream<String> streamList = strList.stream();//集合转为stream 3 strList = streamList.distinct().filter(str->!str.equals(&

Java8 Stream API

Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8); // 读取文件到字符串中 List<String> words = Arrays.asList(c

Stream API

引例: 1 List<String> strList = Arrays.asList("zhaojigang","nana","tianya","nana"); 2 Stream<String> streamList = strList.stream();//集合转为stream 3 strList = streamList.distinct().filter(str->!str.equals(&

Java8新特性Stream API与Lambda表达式详解(1)

1 为什么需要Stream与Lambda表达式? 1.1  为什么需要Stream Stream作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggr

Java 8 Stream API具体解释

Java 8 Stream API具体解释 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是全然不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream.Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强.专注于对集合对象进行各种非常便捷.高效的聚合操作或大批量数

Upgrading to Java 8——第四章 The Stream API

在这章中我们将学习Stream API,在JDK 8 中的一项新的特性.为了理解这一章的主题,你需要知道如何使用Lambda表达式和java.util.function里的预定义的函数式接口. 一个Stream 类似于一个管道,但它里面运输的不是水和石油,而是把数据从源头运输到目的地.根据传递的方式,一个stream可以是并行和并发的.并行的stream运行在多核的CPU的机器上会很有用. 乍一看,一个stream就像是一个集合容器,但是,它不是一个数据结构用来存储对象,它只是负责移动对象,所以