PHP Stream API初探
来源:互联网 发布:淘宝正版cd卖家推荐 编辑:程序博客网 时间:2024/05/04 16:21
和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-8stream_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初探
- java stream API初探(一):为了简洁
- java stream API初探(二):为了高效
- GyPSii API - PHP应用初探
- Stream API:创建Stream
- Stream API
- Stream API
- Stream API
- Stream API
- Stream API
- Stream API
- Stream API
- spark stream初探
- Java8 Stream 初探(一)
- Java Stream初探(二)
- nginx stream模块初探
- php stream
- Stream API:Optional类型
- 数论 D - 寒假安排 --acdream ACdream原创群赛(12)のBUAA选拔赛
- 【Heritrix基础教程之4】开始一个爬虫抓取的全流程代码分析
- 浅析PHP Socket技术
- 设备初始化缩水篇(二)
- hdu 2602 Bone Collector
- PHP Stream API初探
- poj2528 Mayor's posters 线段树,成段更新,离散化
- request.querystring、request.form的区别和联系
- [推荐系统]推荐系统实践Reference
- 网络查询问题的常用工具
- HTML5学习笔记之总纲
- Partial Load在QlikView中的用途
- GDC dispatch_semaphore
- hive文件存储格式